protocol Serenable {
// Generic은 타입을 지정을 해줘야 사용할 수 있음
associatedtype Element
func runRowan()
}
func whatRetrunType<T: Serenable>(_ serena: T) -> T {
return serena
}
func whatRetrunType<T: Serenable>(serenable serena: T) -> any Serenable { // 현재 타입을 모르기때문에 any
return serena
}
func whatReturnType<T: Serenable>(opaque serena: T) -> some Serenable {
return serena
}
struct Rowan: Serenable {
typealias Element = Int
func runRowan() {
print("로웬입니다")
}
func doRowan() {}
}
let rowan = whatRetrunType(Rowan())
// let rowan: Rowan
// -> Rowan()의 메서드, protocol Serenable의 메서드 모두 사용 가능
let rowan2 = whatRetrunType(serenable: Rowan())
// 즉, 프로토콜 정의부에 associatedType을 사용했거나, Self 타입을 사용하는 프로토콜이라면 타입 자체가 제네릭하게 되므로 반환 타입으로 사용할 수 없습니다.
let alsoRowan = whatReturnType(opaque: Rowan())
// let alsoRowan: some Serenable
// -> protocol인 Serenable의 메서드만 사용가능
rowan.doRowan()
rowan.runRowan()
rowan2.runRowan()
alsoRowan.runRowan()
728x90
'TIL' 카테고리의 다른 글
UserDefault (0) | 2024.05.03 |
---|---|
Storyboard (1) | 2024.01.25 |
Opaque And Boxe Type (2) (0) | 2024.01.19 |
Opaque And Boxe Type (1) (0) | 2024.01.19 |
UICollectionView (0) | 2023.12.15 |