티스토리 뷰
Indetifiable Protocol 프로토콜을 공부하려다 보니 AssoicatedType이 나오더라구요!? 확실히 공부하고 지나갑시다!!
TypeAlias
우선 typealias를 알아보는게 좋을 것 같더라구요
typealias는 기존에 선언되어있는 타입들에 대한 별칭? 별명을 선언해주어 좀 더 이해하기 쉽거나 가독성있게 해줄 수 있는 키워드이며
아래와 같이 사용합니다.
typealias { 별명 } = existing type { 존재하는 타입 }
굳이? 왜? 라는 생각이 드실까봐 예제를 몇개 꺼내어 볼게요.
typealias Name = String
기존에 존재하는 String타입에 Name이라는 별명을 지어줬습니다.
이렇게 되면 해당 Name이라는 타입을 실제 사용은 String으로 쓸 수 있습니다.
class User {
let name: Name = "댕우"
}
사실 쓰고 있는 저도 이 부분에서는 아직 그렇게 필요한 지는 모르겠어요!
근데 아래 예제들은 쓸만할 것 같네요!
클로저에서 사용
var add: ((Int, Int) -> (Int)) = {
return $0 + $1
}
위와 같은 클로저 타입을 보다 간결하게 아래처럼 사용할 수 있습니다!
typealias Add = (Int, Int) -> (Int)
var add: Add = {
return $0 + $1
}
프로토콜에서 사용
저희가 CollectionView를 사용하려면 어떻게해야하죠?
UICollectionViewDelegate
UICollectionViewDataSource
UICollectionViewDelegateFlowLayout
이 세가지 델리게이트를 모두 채택해주어야합니다! 아주아주 길어요! 이 부분에서도 typealias를 이용해 이렇게 가능합니다.
typealias CollectionViewDelegate = UICollectionViewDelegate & UICollectionViewDataSource & UICollectionViewDelegateFlowLayout
extension ViewController: CollectionViewDelegate {
...
}
여기까지 typealias였구요
AssociatedType
이제부터 알아볼 associatedType은 typealias랑은 조금 다릅니다.
프로토콜에서 주로 쓰인다고 하는데요 아래 형태로 쓰입니다.
associatedtype { 별명 } - ①
또는
associatedtype { 별명 } : { Protocol } - ②
typealias처럼 존재하는 타입의 별명을 지어 사용할 수 있는 것은 맞는데 선언시에 특정 타입을 지정해 주는것이 아닙니다.
제네릭을 아시나요!? 외부에서 타입을 지정해줌으로써 재사용성을 높이는 방법인데요.
선언할 때 지정하는 것이 아니라
protocol TestProtocol {
associatedtype Test
var test: Test { get set }
}
TestProtocol을 채택한 타입에서 test라는 연산 프로퍼티를 꼭 구현해야겠죠?
그 때 test의 값으로 들어오는 값의 자료형! 의 별명이 Test가 되는 것입니다!
위 코드와 같은 경우에서는 만약 test에 정수형 값 ex(1,2,3,4...) 등이 들어간다면 Test는 Int형의 별명이 되는거구요
test에 문자열 값 ex("test","string") 등이 들어간다면 Test는 String의 별명이 되는 겁니다!
이해가 되셨을까요!?
② 같은 경우에는 Test가 무슨 자료형의 별명이 될지는 아직 모르겠지만 뒤에 있는 프로토콜을 채택하는 자료형이여야해 라는 말입니다.
associatedtype Test: Equatable
위와 같은 경우에
Test 속성은 Euqatable을 무조건 채택하고 있는 타입의 별명이어야 오류가 안납니다!!
이제 알게 되었는데! associatedtype은 Generic의 개념 중 하나라고 하네요!!
'Swift' 카테고리의 다른 글
[Swift] TaskGroup이란? (0) | 2024.04.11 |
---|---|
[Xcode] 생산성을 높이는 효율적인 단축키 모음 (1) | 2024.03.31 |
[Swift] TextField ClearButton Image 커스텀하기 (0) | 2023.06.29 |
[Swift] SpriteKit Particle effect다루기[1] (0) | 2023.05.25 |
[Swift] GameplayKit 으로 무얼 할 수 있을까 [1] (0) | 2023.04.09 |