- structure, enumeration, class์ ์ฒญ์ฌ์ง ์ ๊ณต
-
Protocol์ ๊ธฐ๋ณธ ๊ตฌํ์ ์ ๊ณตํ ์ ์๋ค.
-
Protocol์ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์๋ค.
- ex) A ํด๋์ค๊ฐ B ํ๋กํ ์ฝ์ ๋ฐ๋ฅธ๋ค.
- Bํด๋์ค๋ฅผ ํ์ฅํ๋ค.
- Aํด๋์ค๋ ํ์ฅํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
// ๋ ์ค์ํํธ ์ค๋ฌ์ด ํํ extension CustomStringConvertible where Self == KimFamily { var description: String { return "kim" } } // ๋ ์ ๋ค๋ฆญํ ํํ extension Sequence where Self.Iterator.Element == KimFaily { // .... }
-
์๋๋ ๊ฒ
โผ๏ธ ย : ์์๋ค๋ฅธ ํ๋กํ ์ฝ์ ์์๋ฐ๋๋ก ํ๋ ๊ฒ. (ํ๋กํ ์ฝ ์์์ ํ๋กํ ์ฝ ์ ์ธํ๋ ๊ณณ์์๋ง ํ ์ ์๋ค.
protocol KimFamily {
static var lastName : String = "๊น"
class func lastNameInitial(): String
}
- mutating function์ protocol์์๋ mutating์ผ๋ก ํ์ํด์ผ ํ๋ค.
- mutating์ผ๋ก ์ ์ธ๋ ํจ์๋ class์์ ๊ตฌํํ ๋๋ mutating์ ๋ถ์ด์ง ์์๋ ๋๋ค.
/**
mutating์ผ๋ก ์ ์ธ๋ ํจ์๋ class์์ ๊ตฌํํ ๋๋ mutating์ ๋ถ์ด์ง ์์๋ ๋๋ค.
*/
protocol Mutating {
mutating func plus()
}
class MutatingClass: Mutating {
var number: Int = 0
func plus() {
number += 1
}
}
ํด๋์ค์์ ํ๋กํ ์ฝ์ initializer๋ฅผ ๊ตฌํํ ๋, required ํค์๋๋ฅผ ๋ถ์ฌ์ผ ํ๋ค.
- ์ด์ : ๋ถ๋ชจ ํด๋์ค๊ฐ ๋ฐ๋ฅด๋ ํ๋กํ ์ฝ์ ์์ ํด๋์ค์์๋ ๋ฐ๋ผ์ผ ํ๋ค. ์์ ํด๋์ค์์๋ ํ๋กํ ์ฝ์ initalizer๋ฅผ ๊ผญ ๊ฐ๋๋ก ๋ง๋ค๊ธฐ ์ํด์.
protocol DefaultInitalizable {
init()
}
class DefaultInitializer: DefaultInitalizable {
required init() {}
}
final class FinalClas: DefaultInitalizable {
init() {}
}
์์ ํด๋์ค์์ intialzier๋ฅผ ๊ฐ๋ ํ๋กํ ์ฝ์ ๋ฐ๋ฅผ๋, ์ด๋ฏธ ๋ถ๋ชจ ํด๋์ค๋ก๋ถํฐ ํ๋กํ ์ฝ์ initailizer์ ๋์ผํ ๊ฒ์ ์์๋ฐ๋ ๋ค๋ฉด required override
๋ฅผ ๋ถ์ฌ์ผ ํ๋ค.
class SubClass: SuperClass, DefaultInitalizable {
required override init() {}
}
- failable initialzer ๊ตฌํ ๋ฐฉ์
in ํ๋กํ ์ฝ | failable initializer | nonfailable intializer |
---|---|---|
๊ตฌํ์ฒด | faliable initialzer | nonfailable initializer |
nonfailable initizlier | implicitly unwrapped failable initializer |
protocol FailableIntializable {
init?()
}
class FailableIntialzier: FailableIntializable {
required init() {}
}
protocol DefaultInitalizable {
init()
}
class NonfailableInitializer: DefaultInitalizable {
required init!() {}
}
- init()?๋ฅผ nil์ ๋ฐํํ์ง ์๋ intializer๋ก ์ค๋ฒ๋ผ์ด๋ฉํ ๋
- init()? โ init!()๋ก ๋ธ๋ฆฌ๊ฒ์ดํธ ํ ๋
- ํ๋กํ ์ฝ์ ํ์ ์ผ๋ก ์ฌ์ฉํ ๋, ๊ตฌ์ฒด ํ์ ์๋ง ์ ์๋์ด์๋ ๊ฒ๋ค์ ์ฌ์ฉ ๋ชปํ๋ค. ์ค์ง ํ๋กํ ์ฝ์ ๋ช ์๋ ๊ฒ๋ง ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
- ๊ตฌ์ฒดํ์ ์๋ง ์ ์๋์ด์๋ ๊ฒ์ ์ฌ์ฉํ๊ณ ์ถ์ผ๋ฉด downcasting์ ํด์ผ ํ๋ค.
- ๊ฐ์ฒด์ ์ฑ ์์ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ๋์ ํด๋ฌ๋ผ๊ณ ๋งก๊ธฐ๋ ๊ฒ
- Delegation ํจํด ๊ตฌํ๋ฐฉ๋ฒ: ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ๋ง๊ธธ ์ฑ ์์ protocol๋ก ๊ตฌํํ๋ค
- ์ฌ์ฉ์์
- ํน์ ์ก์
์ ์๋ตํ๋ ๋ก์ง์ด ์ํฉ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๊ฒ ํ ๋
- button listener๋ฅผ ๊ตฌํํ๋ ๊ฒโ button์ด ๋๋ ธ์ ๋์ ๋ก์ง์ ๊ฐ๋ฐ์๊ฐ ์ ์ํ๊ฒ ํ๋ค.
- = ํ ๊ฐ์ฒด์ ์ํ ๋ณํ๊ฐ ์ผ์ด๋ ๋, ์ผ์ด๋์ผ ํ๋ ์ด๋ฒคํธ๋ฅผ delegate ํจํด์ผ๋ก ๊ตฌํํ๋ค.
- ์ธ๋ถ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ป์ด์ฌ ๋, ๋ฐ์ดํฐ์ ์ถ์ฒ๋ฅผ ๋ชฐ๋ผ๋ ๋ ๋
- ํน์ ์ก์
์ ์๋ตํ๋ ๋ก์ง์ด ์ํฉ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๊ฒ ํ ๋
- ์ฌ์ฉ ์ด์
- ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ค์ฌ์ค๋ค.
- ๋์ผํ ์ธํฐํ์ด์ค๋ก ์ฒ๋ฆฌ ๋ก์ง์ ๋ค๋ฅด๊ฒ ํ ์ ์๋ค.
protocol Dice
- where๋ฅผ ์ฌ์ฉํ๋ฉด, ์ ๋ค๋ฆญ ์์น์ ์ด๋ค ๊ตฌ์ฒด ํ์ ์ด ๋ค์ด์ค๋๋์ ๋ฐ๋ผ์, ํ๋กํ ์ฝ์ ๋ฐ๋ฅผ์ง ๋ง์ง๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค.
protocol TextRepresentable {
var description: String { get }
}
extension Array: TextRepresentable where Element: TextRepresentable {
var description: String {
let itemAsText = self.map { $0.description }
return "["+ itemsAsText.joined(seperator: ",") + "]"
}
}
extension Dice: TextRepresentable {
var description: String {
return "A \(sides)-sided dice"
}
}
let d6 = Dice()
let d12 = Dice()
let myDice = [d6, d12]
myDice.description // ๐ต
let lastNames = ["kim", "park"]
lastNames.description // โ ์ปดํ์ผ ์๋ฌ ๋ฐ์
-
์์ ์ค๋ช : Array์ ์์(Element)๊ฐ TextRepresentable ํ๋กํ ์ฝ์ ๋ฐ๋ฅผ ๋, Array๋ TextRepresenteable์ ๋ฐ๋ฅธ๋ค.
-
๋ง์ผ ํ๋กํ ์ฝ ๊ตฌํ์ฒด๊ฐ ์ฌ๋ฌ ์กฐ๊ฑด์ ๋ง์กฑํ๋ค๋ฉด? Swift ์ปดํ์ผ๋ฌ๋ ๊ฐ์ฅ ๊ตฌ์ฒด์ ์ธ ์กฐ๊ฑด์ ๊ฐ์ง extension์ ์ฌ์ฉํ๋ค.
extension Array: TextRepresentable where Element: TextRepresentable { var description: String { let itemAsText = self.map { $0.description } return "["+ itemsAsText.joined(seperator: ",") + "]" } } extension Array: TextRepresentable where Element: Int { var description: String { let itemAsTest = self.map { $0.description { return "number:" + itemAsText.joined(seperator: ",") } } let numbers = [1, 2, 3, 4, 5] print(numbers.description) // -> 2๋ฒ์งธ extension์ description์ ์ฌ์ฉํ๋ค.
์ด๋ฏธ ํ๋กํ ์ฝ์ ๊ตฌ์ฑ์์๋ฅผ ๊ตฌํํ๊ณ ์๋ ๊ฒ์ extension์ผ๋ก ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋๋ก ํ ๋
- extension์ ๋ฐ๋๋ฅผ ๋น์๋์ด๋ ๋๋ค.
protocol TextRepresentable {
var description: String { get }
}
struct Hamster {
var name: String
var description: String {
return "A hamster named \(name)"
}
}
extension Hamster: TextRepresentable {}
Swift์์ ์ ๊ณตํ๋ Equatable, Hashable, Comparable ํ๋กํ ์ฝ์ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ํ๋กํ ์ฝ ๊ตฌํ์ ์๋์ผ๋ก ํด์ค๋ค.
- Equatable ๊ตฌํ์ ์๋์ผ๋ก ํด์ฃผ๋ ์กฐ๊ฑด
- Strcuture์ ๊ฒฝ์ฐ: ๋ชจ๋ stored property๊ฐ Equatable์ ๋ฐ๋ฅผ ๋
- Enumeration์ ๊ฒฝ์ฐ: asssicatedtype์ ๊ฐ์ง์ง ์์ ๋ or ๋ชจ๋ associatedtype์ด Equatable์ ๋ฐ๋ฅผ๋
- Hashable ๊ตฌํ์ ์๋์ผ๋ก ํด์ฃผ๋ ์กฐ๊ฑด
- Strcuture์ ๊ฒฝ์ฐ: ๋ชจ๋ stored property๊ฐ Hashable์ ๋ฐ๋ฅผ ๋
- Enumeration์ ๊ฒฝ์ฐ: asssicatedtype์ ๊ฐ์ง์ง ์์ ๋ or ๋ชจ๋ associatedtype์ด Hashable์ ๋ฐ๋ฅผ๋
- Comparable ๊ตฌํ์ ์๋์ผ๋ก ํด์ฃผ๋ ์กฐ๊ฑด
- Enumerataion์ ๊ฒฝ์ฐ: rawValue๋ฅผ ๊ฐ์ง ์์๋ or assciatedtype์ ๊ฐ์ง๋ฉด ๋ชจ๋ assocatedtype์ด Comparable์ ๋ฐ๋ฅผ ๋
- ํ๋กํ ์ฝ์ ํฉ์ณ์ ์ฌ์ฉํ๋ ๊ฒ
- ํํ:
SomeProtocol
&AnotherProtocol
- ํ๋กํ ์ฝ ํฉ์ฑ์ Class๋ฅผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค. ๋จ, 1๊ฐ์ ํด๋์ค๋ง ๊ฐ๋ฅ
- ์์) Named ํ๋กํ ์ฝ, Aged ํ๋กํ ์ฝ ํฉ์ฑ
protocol Named {
var name: String { get set }
}
protocol Aged {
var age: Int { get set }
}
struct Person: Named & Aged {
var name: String
var age: Int
}
func wishHappyBirthday(to celebrator: Named & Aged) {
print("Happy Birthday, \(celebrator.name), you're \(celebrator.age)")
}
- wishHappyBirthday๋ Named์ Agedํ๋กํ ์ฝ์ ๋ชจ๋ ๊ตฌํํ ์ธ์คํด์ค๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ ์๋ค.
- ๊ตฌ์ฒดํ์ ์ด ๋ฌด์์ธ์ง๋ ์๊ด์ด ์๋ค!
- ๋ง์ผ SomeProtocol๊ณผ AnotherProtocol์ ๊ตฌํํ ํ์ ์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํ์.
func foo(person: Person)
func foo(abstract: SomeProtocol & AnotherProtocol)
-
์ฒซ๋ฒ์งธ foo()๋ Person ์ธ์คํด์ค๋ง ์ธ์๋ก ๋ฐ์ ์ ์๋ค.
-
๋๋ฒ์งธ foo()๋ Person ์ธ์คํด์ค ๋ฟ๋ง ์๋๋ผ SomeProtocol๊ณผ AnotherProtocol์ ๊ตฌํํ ํ์ ์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ ์๋ค.
โ ๋๋ฒ์งธ foo()๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
is
: true ๋ฐํ โ ํน์ ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๊ฒas?
:downcasting ์๋ ์ฑ๊ณตย โ ํน์ ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๊ฒas!
: downcasting ์๋ ์ฑ๊ณต, ์คํจ์ runtime errorย โ ํน์ ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๊ฒ
-
ํ๋กํ ์ฝ์ ๊ตฌ์ฑ์์ ์ค ๊ตฌํํด๋ ๋๊ณ , ์ํด๋ ๋๋ ๊ฒ์ Optional Requirement๋ผ๊ณ ํ๋ค.
-
์ฌ์ฉ ๋ฐฉ๋ฒ:
@objc protocol CounterDataSource { @objc optional func increment(forCount count: Int) -> Int @objc optional var fixedIncrement: Int { get } }
-
์ ์ธํ ๋:
optional
ํค์๋ ์ฌ์ฉ &@objc
ํค์๋ ์ฌ์ฉ@objc
ํ๋กํ ์ฝ์ ํด๋์ค or@objc
ํด๋์ค๋ง ๋ฐ๋ฅผ ์ ์๋ค. -
์ฌ์ฉํ ๋:
- ๋ฉ์๋์ ๊ฒฝ์ฐ ์ฌ์ฉํ ๋
?
ํ์ - ํ๋กํผํฐ์ ๊ฒฝ์ฐ optional ํ์ ์ด ๋๋ค.
- (๊ตฌํ๋์ด์์ง ์์์ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.)
- ๋ฉ์๋์ ๊ฒฝ์ฐ ์ฌ์ฉํ ๋
-
-
์ธ์ ์ฌ์ฉ? Objective-Cํ๊ณ ๊ฐ์ด ๋์ํด์ผ ํ๋ ์ฝ๋๋ฅผ ๋ง๋ค ๋
- ์ ํ์์ ๊ถ์ฅ: ๋ค์ค ์์์ ํตํด โ ๊ธฐ๋ฅ์ ์กฐ๋ฆฝํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ
- ์ถ์ํ ์๋จ (๊ฐ์ฒด์งํฅ์์ ์ธํฐํ์ด์ค(์๋ฐ์ ๊ทธ ์ธํฐํ์ด์ค ์๋) ๊ตฌํํ ๋ ์ฌ์ฉ)
- DIP๋ฅผ ๊ตฌํํ ๋ ์ฌ์ฉ
- Delegate ํจํด