본문 바로가기

TIL

Opaque And Boxe Type - 이해용 샘플 코드

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