ν°μ€ν 리 λ·°
[μ€μννΈ(Swift) νλ‘κ·Έλλ°] - Generic(μ λ€λ¦)
B_log 2021. 6. 16. 11:19π― μ λ€λ¦(Generic) in Swift
π§π»βπ» What - μ λ€λ¦μ΄λ?
Swiftλ μ΄λ€ λ³μλ μμ, νΉμ ν¨μ(λ©μλ)μ νλΌλ―Έν° λ±μ ꡬνν λ νμ μ μ§μ ν©λλ€. νμ μ λͺ μν¨μΌλ‘μ¨ μ»΄νμΌλ¬μκ² ν΄λΉ κ°μ νμ μ λͺ νν μ€λͺ ν΄μ£Όκ³ , μ½λλ₯Ό μ½λ κ°λ°μλ€μ μ μ₯μμ ν΄λΉ κ°μ νΉμ±μ λ μ μ΄ν΄ν μ μλλ‘ λμμ€λλ€. λ¬Όλ‘ νμ μΆλ‘ κΈ°λ₯μ ν΅ν΄ νμ λͺ μλ₯Ό μλ΅ν΄μ€ μ μμ§λ§ νΉμ νμ μ΄ νμ λμ΄μΌ νλ κ²μ λ§μ°¬κ°μ§μ λλ€.
μ΄λ° μν©μμ λ‘μ§μ μμ ν κ°μλ° μ λ ₯κ°μ νμ λ§ λ€λ₯Έ κ²½μ° μ΄λ»κ² λμ΄μΌ ν κΉμ? μΌλ°μ μΌλ‘ μ€λ²λ‘λ©(over loading)μΌλ‘ ν¨μλ₯Ό νμ λ€μ λ§κ² μ μν μ μμ§λ§ κ·Έκ² μμ 무μλ―Έν μ½λμ λ°λ³΅μ΄ λ©λλ€.
Swiftλ μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ
Generic
μ΄λΌλ κΈ°λ₯μ κ°μ§κ³ μμ΅λλ€. νΉμ νμ μ 미리 μ§μ νλ κ²μ΄ μλλΌ μ¬μ©ν λ νμν νμ μ μ μΈν΄μ£Όλ ννλ‘ νμ μ μΌλ°ν νμ¬ μ μΈνλ€κ³ ν μ μμ΅λλ€.μμλ₯Ό ν΅ν΄ μ΄ν΄λ³΄κ² μ΅λλ€!
π Why - μ λ€λ¦μ΄ νμν μ΄μ
μ°μ λ Intκ°μ κ΅ννλ λ©μλλ₯Ό μ μΈν΄λ³΄κ² μ΅λλ€.
func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a a = b b = temporaryA }
inout
μ΄ μ΄ν΄κ° μ΄λ €μ°μ λΆλ€μ μ½κ² μκ°ν΄μ λ μ λ ₯ νλΌλ―Έν° a, bλ₯Ό κ΅νν΄μ£Όλ λ©μλλΌκ³ μκ°νμλ©΄ λ©λλ€!μ΄ λ©μλλ₯Ό μ μ¬μ©νκ³ μμλλ°
Int
κ° μλString
μ κ΅νν΄μΌν λ©μλκ° νμνλ©΄ μ΄λ»κ² ν΄μΌν κΉμ?μλμ κ°μ΄ ν¨μλ₯Ό λ μ μν©λλ€.
func swapTwoStrings(_ a: inout String, _ b: inout String) { let temporaryA = a a = b b = temporaryA }
λ‘μ§μ΄ μμ ν κ°μ§λ§ νλΌλ―Έν°λ₯Ό μν΄ μλ‘μ΄ ν¨μλ₯Ό μ μνμ΅λλ€. λ¬Έμ κ° ν΄κ²°λ¬μΌλ λ μ½λλ₯Ό μμ±νλ€κ° μ΄λ²μλ
Double
νμ κ΅νμ΄ νμν©λλ€. κ·ΈλΌ λΉμ°ν λ μ μλ₯Ό ν΄μΌκ² μ£ ?
func swapTwoDoubles(_ a: inout Double, _ b: inout Double) { let temporaryA = a a = b b = temporaryA }
μ μ μλ μ¬λΆλ₯Ό λ λμ μ΄λ° μμ ꡬνμ 무μλ―Έν μ½λμ λ°λ³΅μ λΆλ¬μ΅λλ€. Nκ°μ νμ μ μ¬μ©νλ€λ©΄ κ°μ λ©μλλ₯Ό Nκ° λ§λ€μ΄μΌ νλ λΆνΈν¨μ΄ μλ κ²μ΄μ£ !
π How - Generic μ¬μ©λ²
κ·ΈλΌ μμ μμλ₯Ό νλ²μ μ μΈν λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€! μλμ κ°μ΄ λ©μλλ₯Ό μ μν΄μ€λλ€.
func swapTwoValues<T>(_ a: inout T, _ b: inout T) { let temporaryA = a a = b b = temporaryA }
κΈ°μ‘΄μ
Int
,String
λ±μΌλ‘ μ μΈλμ΄ μμλ νμ μT
λΌλ μΌλ°νλ νμ μ λ£μ΄μ£Όκ³ , λμ μ λ©μλ μ΄λ¦ μμ<T>
λΌλ λ§νΉμ ν΄μ£Όμμ΅λλ€.T
μ 무μμ΄ λ€μ΄κ°λμ λ°λΌ μμ ν¨μλT
λ‘ νκΈ°λ νμ μ μ¬μ©νκ³ μΆμ νμ μ μΌκ΄μ μΌλ‘ μ μΈν΄μ£Όλ κ²μ΄μ£ !μ΄μ μμ μ μλ λ©μλλ‘ κ°μ λ³κ²½ν΄λ³΄κ² μ΅λλ€.
var someInt = 3 var anotherInt = 107 swapTwoValues(&someInt, &anotherInt) // someInt is now 107, and anotherInt is now 3 var someString = "hello" var anotherString = "world" swapTwoValues(&someString, &anotherString) // someString is now "world", and anotherString is now "hello"
νΉλ³ν νμ μ λͺ μν νμ μμ΄ μ λ ₯λ κ°μ νμ μ ν΅ν΄ μλμ μΌλ‘
T
μ κ°κ°Int
,String
μ ν λΉνμ¬ μ¬μ©νμ΅λλ€.μ΄λ κ² λ³΄λ©΄ λ―μ€ μ μμ§λ§ μ¬μ€ κ·Έλμ μ°λ¦¬λ
Generic
κΈ°λ₯μ λ§μ΄ μ¬μ©νκ³ μμμ΅λλ€.λνμ μΈ κ²μ΄
Array
,Dictionary
μ λλ€. λ°°μ΄μ μ μν λ νμ μ μ§μ ν΄μ μ΄λ€ νμ μ λ°°μ΄μΈμ§ λͺ μνμλλ° μ΄ κ°λ μ΄ λ°λ‘Generic
μ λλ€. λ°°μ΄μ μ¬μ©νλ μμλ‘Stack
ꡬνμ μ΄ν΄λ³΄κ² μ΅λλ€.
struct Stack<Element>: Container { // original Stack<Element> implementation var items: [Element] = [] mutating func push(_ item: Element) { items.append(item) } mutating func pop() -> Element { return items.removeLast() } // conformance to the Container protocol mutating func append(_ item: Element) { self.push(item) } var count: Int { return items.count } subscript(i: Int) -> Element { return items[i] } }
μμ Stackμ κ²½μ° μλ£κ΅¬μ‘°μ νλλ‘ νμ μ΄ νΉμ λλ©΄ μλ©λλ€. λ€μ λ§νλ©΄
Int
λ§ λλ μ€νμ ν¨μ¨μ±μ΄ λ¨μ΄μ§κ² μ£ ? κ·Έλμ μμ κ°μ΄Generic
μΌλ‘ μ μΈνμ¬ μ¬μ©ν©λλ€.
π§ One more step - νκ±Έμ λ
Generic
μ΄ λ§λ₯μΈ κ² κ°μ§λ§ μ¬μ€ μκ°ν΄λ³΄λ©΄ ν° μ€λ₯μ κ°λ₯μ±μ λ΄ν¬νκ³ μκΈ°λ ν©λλ€.
func newMultiply<T>(param1: T, param2: T) -> T { return param1 * param2 * 2 }
μμ λ©μλλ μ λ ₯ λ°μ parameterλ₯Ό κ³±νλ μ°μ°μ΄ μκΈ° λλ¬Έμ λΉμ°ν κ³±νκΈ° μ°μ°μ΄ κ°λ₯ν νμ μ΄ λ€μ΄μμΌν©λλ€.
Int
,Double
,Float
λ±μ νμ μ΄ μμ μ μμ΅λλ€. μ΄λ° λ€μν νμ μ μν΄Generic
μΌλ‘ μ μΈμ΄ λ κ²μΈλ°μ, λ§μ½μ μ΄Generic
μString
μ΄ λ€μ΄μ€λ©΄ μ΄λ»κ² λ κΉμ? μ°μ° μμ²΄κ° μ±λ¦½νμ§ μκ² λ©λλ€.κ·Έλμ XCodeλ μμ μ μκ° λΆμ ννλ€λ λ©μΈμ§λ₯Ό μ€λλ€. μΆ©λΆν μ λ³΄κ° μλ€λ κ²μ΄μ£ . μ΄λ΄ λ νμν κ²μ΄ μ λ€λ¦ν νμ μ ꡬ체ν ν΄μ£Όλ κ²μ λλ€.
func newMultiply<T: BinaryInteger>(param1: T, param2: T) -> T { return param1 * param2 * 2 }
μμ κ°μ΄ Generic νμ μΈ Tλ₯Ό λ¨μν μ μΈν΄μ£Όλ κ²μ΄ μλλΌ BinaryInteger νλ‘ν μ½μ λ°λ₯΄κ² ν΄μ£Όλ©΄ μ€λ₯κ° ν΄κ²°λ©λλ€. μ΄λ κ² νμ μ μ μ½μ μ£Όλ κ²μ νμ μ μ½(Type Constaints) μ΄λΌκ³ νλ©° μ΄λ¬ν μ μ½μ ν΄λμ€ νμ λλ νλ‘ν μ½λ‘λ§ μ€μ κ°λ₯ν©λλ€. νΉμ ν΄λμ€λ₯Ό μμλ°λ νμ μ΄μ΄μΌνκ±°λ νΉμ νλ‘ν μ½μ μ±νν νμ μ΄μ΄μΌνλ€λ μ μ½μ μ€μ νλ κ²μ λλ€.
μ λ€λ¦ νμ μ νκ°κ° μλλΌ μ¬λ¬κ° μ€μ λ μ μμ΅λλ€.
func someMethod<T, U, V> (param1: T, param2: U, param3: V) { ... }
μ²λΌ μΌν(,)λ₯Ό ν΅ν΄ μ¬λ¬κ° μ μΈν μ μμ΅λλ€.
Reference: https://docs.swift.org/swift-book/LanguageGuide/Generics.html
'iOS μ±κ°λ° > Swift Basic' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
- Total
- Today
- Yesterday
- λ μ§ κ³μ°#BOJ#μμ νμ#Python
- ν λ§ν #λ°±μ€μκ³ λ¦¬μ¦#Python
- API#lazy#
- django#slicing
- λ°±μ€ μκ³ λ¦¬μ¦#BackTracking
- ν°νλΉμΉ#리μ½#xbox#controller
- NumberofDiscIntersections#Codility#Sort#Python
- μμ΄μ¬μ΄ν΄#BOJ#Python
- λ³λ λμ΄νΈ#BOJ#νμλ²#Python
- νμ΄μ¬μκ³ λ¦¬μ¦μΈν°λ·°#4μ₯
- μΏΌλνΈλ¦¬#BOJ#λΆν μ 볡#Python
- λ―Έλ‘ νμ#λ°±μ€μκ³ λ¦¬μ¦#Python
- Triangle#Sorting#Codility#Python
- PassingCars#Codility#Python
- μνΈμ½λ#dp#BOJ#Python
- λ°λ³΅μμ΄#λ°±μ€μκ³ λ¦¬μ¦#Python
- μ¬μκ°μ#λ°±μ€μκ³ λ¦¬μ¦#Python
- filter#isalnum#lower
- NμΌλ‘ νν#DP#Programmers#Python
- Distinct#Codility#Python
- 곡μ κΈ° μ€μΉ#BOJ#μ΄λΆνμ#Python
- λ°°μ΄ν©μΉκΈ°#λΆν μ 볡#BOJ#Python
- 리λͺ¨μ»¨#μμ νμ#BOJ#Python
- μ’ μ΄μλ₯΄κΈ°#λΆν μ 볡#BOJ#Python
- Swift#Tuples#Range
- ν νλ‘μ νΈ#λ°±μ€μκ³ λ¦¬μ¦#Python
- λμ μλ₯΄κΈ°#μ΄λΆνμ#BOJ#Python
- django
- λ무μλ₯΄κΈ°#BOJ#μ΄λΆνμ#Python
- Brackets#Stacks and Queues#Codility#Python
μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |