π¬ μ λ€λ¦ λ¬Έλ²μ΄ νμν μ΄μ
νμ λ§ λ€λ₯΄κ³ ꡬν λ΄μ©μ΄ λμΌνλ° κ΅³μ΄ ν¨μλ₯Ό μΆκ°μ μΌλ‘ λ°λ³΅ν΄μ λ§λ€μ΄μΌν νμκ° μμκΉ!
μ λ€λ¦μ΄ μλ€λ©΄ ν¨μ(λΏλ§ μλλΌ ν΄λμ€, ꡬ쑰체, μ΄κ±°ν λ±λ κ°λ₯) νμ λ§λ€ λͺ¨λ κ²½μ°λ₯Ό λ€ μ μν΄μΌν΄μ
κ°λ°μμ ν μΌμ΄ λ§μμ§λ€. -> μ μ§λ³΄μ/ μ¬μ¬μ©μ±μ΄ μ΄λ €μ
μ¦, ν¨μλ₯Ό νλλ§ κ΅¬ννλ©΄ λ΄λΆμ μλ νμ μ μΈμ λ μ§ λ°κΏμ μ¬μ© κ°λ₯
-> μ λ€λ¦μ΄ μλ€λ©΄ ν¨μλ₯Ό λͺ¨λ νμ λ§λ€ λ€μ μ μ ν΄μ μ¬μ©ν΄μΌνλ€.
-> μ¬λ¬λ² μ€λ³΅ν΄μ ꡬνν΄μΌνλ νμκ° μμ΄μ§λ€.
νμ νλΌλ―Έν°λ ν¨μ λ΄λΆμμ νλΌλ―Έν° νμμ΄λ 리ν΄νμΌλ‘ μ¬μ©λλ€. ν¨μ λ°λμμ μ¬μ©λ κ°λ₯.
λ³΄ν΅ Tλ₯Ό μ¬μ©νμ§λ§ λ€λ₯Έ μ΄λ¦ μ¬μ©λ κ°λ₯. 2κ° μ΄μλ κ°λ₯.
π 1 . μ λ€λ¦ ν¨μ μ μ
ν¨μ μ΄λ¦ μμ <> λ₯Ό μ¬μ©ν΄ νλΌλ―Έν° Tλ₯Ό μ μ΄μ€λ€. λ³΄ν΅ Typeμ μλ―Ένλ Tλ₯Ό μ¬μ©νλ€.
<>μμ μλ TλΌλ λ¬Έμλ₯Ό νμ νλΌλ―Έν°λ‘ μ μν λ μ¬μ©ν κ±°λΌλ μλ―Έ.
μλ‘ λ€λ₯Έ νμ μ μ¬μ©ν λλ μλ€.
μ λ€λ¦μ μ€μ νμ μ΄λ¦μ μ¨μ£Όλ λμ μ placeholderλ₯Ό μ¬μ©νλ€. [ eg: T, V, U ]
placeholderλ νμ μ μ’ λ₯λ₯Ό μλ €μ£Όμ§ μμ§λ§ μ΄λ€ νμ μ΄λΌλ κ²μ μλ €μ€λ€.
placeholderμ μ€μ νμ μ ν¨μκ° νΈμΆλλ μκ° κ²°μ λλ€.
νλμ νμ 맀κ°λ³μλ₯Ό κ°μ§ μκ³ μ¬λ¬ κ°μ νμ 맀κ°λ³μλ₯Ό κ°κ³ μΆλ€λ©΄ ννμ΄κ΄νΈ κΈ°νΈ μμͺ½μ μΌνλ‘ λΆλ¦¬ν μ¬λ¬ κ°μ νμ 맀κ°λ³μλ₯Ό μ§μ ν΄μ€ μ μλ€. [ eg: <T, U> ]
//μμ 1) λ°°μ΄μ μΆλ ₯
func printArray<T>(array: [T]){
//ν¨μ μ€ν λ΄μ© μμ±
}
//μμ 2) 2κ°μ§ νμ
μ μ¬μ©ν κ²½μ°
func swapTwoValues<T, A>(_ a: inout T, _ b: inout A) {
//ν¨μ μ€ν λ΄μ© μμ±
}
1. μ°λ¦¬κ° κ·Έλμ κ°λ¨νκ² μ¬μ©ν΄μλ λ°°μ΄μ μ κ· λ¬Έλ²μ λ€μ 보면 μ λ€λ¦μΌλ‘ λμ΄μμλ€.
Array<Element>λ‘ μ μ λμ΄ μμ΄μ Element λΆλΆμ String, Int λ±μ λ£μ΄ μ¬μ©ν μ μμλ κ²!!
2. λμ λ리 Dictionary<key, value>λ λ€μ 보면 μ λ€λ¦μ΄λ€.
μλ‘ λ€λ₯Έ λ νμ keyμ valueλ₯Ό μ¬μ©ν μ μλ κ².
3. μ΅μ λ νμ λ μ λ€λ¦μ΄λ€.
4. κ³ μ°¨ν¨μ mapλ μ λ€λ¦μ΄λ€
μ μλ₯Ό StringμΌλ‘ λ°κΏ μ μκ³ Doubleλ‘λ λ°κΏ μ μμλ κ²!
/*
inout ν€μλλ ν¨μ λ΄μμ 맀κ°λ³μλ‘ μ λ¬λ κ°μ λ³κ²½νκ³ ,
μ΄λ₯Ό ν¨μ μΈλΆμμλ λ°μν μ μλλ‘ νλ λ° μ¬μ©λ©λλ€.
μ΄λ₯Ό ν΅ν΄ ν¨μ λ΄μμ 맀κ°λ³μμ κ°μ μ§μ μμ ν μ μμ΅λλ€.
inout ν€μλ μ¬μ© λ°©λ²:
1. 맀κ°λ³μμ inout ν€μλλ₯Ό λΆμ¬ μ μΈν©λλ€.
2. ν¨μ νΈμΆ μ 맀κ°λ³μλ₯Ό & κΈ°νΈλ‘ μ λ¬νμ¬ ν΄λΉ κ°μ μ°Έμ‘°λ‘ μ λ¬ν©λλ€.
*/
// ν¨μ μ μ
func increment(_ value: inout Int) {
value += 1
}
var number = 5
print("Before increment: \(number)") // μΆλ ₯: Before increment: 5
// ν¨μ νΈμΆ μ 맀κ°λ³μμ &λ₯Ό μ¬μ©νμ¬ λ³μμ μ°Έμ‘°λ₯Ό μ λ¬
increment(&number)
print("After increment: \(number)") // μΆλ ₯: After increment: 6
π 2. μ λ€λ¦κ³Ό ꡬ쑰체/ ν΄λμ€/ μ΄κ±°ν
//기쑴 ꡬ쑰체
struct Member {
var members: [String] = []
}
//struct GenericMember<T> {
var members: [T] = []
}
var member1 = GenericMember(members: ["a", "b", "c"]) //μ΄μ λΆν° String νμ
μΌλ‘ κ²°μ λλ€.
var member2 = GenericMember(members: [1, 2, 3]) //μ΄μ λΆν° Int νμ
μΌλ‘ κ²°μ λλ€.
μ΄κ±°νμ μ°κ΄κ°μ κ°μ§ λλ§ μ¬μ©ν μ μλ€.
π 3. νλ‘ν μ½μμμ μ λ€λ¦ μ¬μ©
μ λ€λ¦μ μ¬μ©ν΄ νλ‘ν μ½μ μ μΈνν λλ κΈ°μ‘΄μ <T>κ° μλ
assoociatedtype(μ°κ΄νμ
) + νμ
νλΌλ―Έν°(첫κΈμ λλ¬Έμ)
νμμΌλ‘ μ¬μ©νλ€.
protocol Container {
associatedtype Item
mutating func append(_ item: Item)
var count: Int { get }
subscript(i: Int) -> Item { get }
}
μ°κ΄νμμ΄ μ μΈλ νλ‘ν μ½ μ±ν μ associatedtypeμ μ€μ νμ μΌλ‘ ꡬ체ννλ€.
typealiasλ‘ νμμ λͺ μ νλ€. (μλ΅ κ°λ₯)
struct IntStack: Container {
// original IntStack implementation
var items: [Int] = []
mutating func push(_ item: Int) {
items.append(item)
}
mutating func pop() -> Int {
return items.removeLast()
}
// conformance to the Container protocol
typealias Item = Int
mutating func append(_ item: Int) {
self.push(item)
}
var count: Int {
return items.count
}
subscript(i: Int) -> Int {
return items[i]
}
}
μ λ€λ¦ νλ‘ν μ½μ μ μ½μ΄κ±΄ μΆκ°
'Itemμ Equatable νλ‘ν μ½μ μ±νν νμ λ§ μ μ κ°λ₯νλ€'μ μλ―Έ.
protocol Container {
associatedtype Item: Equatable
mutating func append(_ item: Item)
var count: Int { get }
subscript(i: Int) -> Item { get }
}
π Reference