일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- DependencyInjection
- cleanarchitecture
- GIT
- GCD
- 청년취업사관학교
- 등굣길
- rxswift
- DiffableDataSource
- SeSAC
- 명품cppProgramming c++
- CoreBluetooth
- 오픈채팅방
- MainScheduler
- DispatchQueue
- 프로그래머스
- DynamicMemberLookup
- 코테
- IOS
- SwiftUI
- MainScheduler.Instance
- MethodSwilzzling
- leetcode
- RaceCondition
- swift
- gitflow
- SRP
- combine
- MainScheduler.asyncInstance
- data_structure
- Realm
- Today
- Total
Do.
Swift - associatedtype in protocols 본문
잘 알겠지만 프로토콜은 '해야할 것'을 명시하는 것으로
만약 클래스에서 프로토콜을 채용하고 있다면 해당 클래스는 채용한 프로토콜에서 알려주는 것들을 꼭 구현 해야 한다.
protocol Spell {
associatedtype SpellType
var word: SpellType { get }
}
struct Fireball: Spell {
typealias SpellType = String
var word: String {
"Go FireBall!!"
}
}
Spell 프로토콜은 주문을 외우기 위한 word라는 속성을 읽기 속성으로 구현해야 한다. word의 타입은
associatedtype인 SpellType 이어야 한다.
그리고 Fireball은 Spell을 채용한다.
그럼 Fireball 마법은 "Go FireBall!!"이라는 문자열로 주문을 외울 수 있다.
Fireball구조체에서 typealias를 생략할 수도 있다.
protocol Spell {
associatedtype SpellType
var word: SpellType { get }
}
struct Fireball: Spell {
var word: String {
"Go FireBall!!"
}
}
typealise 를 생략해도 빌드가 잘 되는 것을 확인할 수 있다.
생략이 가능한 이유는 컴파일러가 알아서 매칭 시켜주기 때문이다.
struct Dimension3 {
var x: Double
var y: Double
var z: Double
}
struct Teleport: Spell {
var word: Dimension3 {
Dimension3(x: 0.2, y: 0.3, z: 0.4)
}
Teleport라는 스펠을 만들려고 하는데 Teloport라는 스펠은 3D 좌표를 주문하면 사용할 수 있다고 하자
associated type은 Dimension3이다.
그런데 스펠을 '조합'해서 조합 스펠을 만들고 싶다.
struct Fireball: Spell {
var word: String {
"Go FireBall!!"
}
}
struct Spear: Spell {
var word: String {
"Spear!!"
}
}
struct FireSpear: Spell {
var word: String {
Fireball().word + Spear().word
}
}
Fireball과 Spear를 조합해서 FireSpear 라는 것을 만들고 싶다. 주문은 두 주문을 연결하면 된다.
그런데 만약 FireBall과 Teleport를 조합하면 어떻게 될까
Dimension3D라는 오브젝트는 String 오브젝트와 합치기가 불가능하다,
그래서 앞으로 Spell을 만들때는 word와 연결이 가능한 상태로 만들도록 하고 싶다.
SpellType은 서로 연결이 가능해야 한다는 뜻이다.
protocol SpellCombinable {
associatedtype CombinableType
static func spellCombine(lhs: CombinableType, rhs: CombinableType) -> String
}
그래서 연결이 가능한 Spell이라는 프로토콜을 만들고
Spell 프로토콜의 associatedtype이 SpellCombinable을 준수하도록 만든다
protocol Spell {
associatedtype SpellType: SpellCombinable
static var word: SpellType { get }
}
그러면 이제 Spell을 채용하는 오브젝트는 SpellCombinable 한 타입만 쓸 수 있다. 커스텀 오브젝트를 쓰고 싶다면 그 오브젝트는 SpellCombinable을 준수하도록 만들면 된다.
전체코드보기
'iOS' 카테고리의 다른 글
Swift - Function Notation (0) | 2022.02.09 |
---|---|
Swift - Any vs AnyObject (0) | 2022.02.09 |
(!!) Xcode is not installed (0) | 2022.02.09 |
Memory Management (0) | 2022.02.09 |
깨알같은 도우미 코드 스닙펫(Code Snippets) (0) | 2022.02.09 |