🍁

Swift: ジェネリクスのプレースホルダの型とtypealiasの優先度とアクセス方法

2022/12/13に公開

protocolを用いた依存性の注入の勉強をしていて、ジェネリクスのプレースホルダの型名とtypealiasで定義した型名が一致した場合、優先度はどうなるのかが気になったので実験してみました。

class Piyo {
    let str = ""
}

class Pico {
    let num: Int = 0
}

protocol HogeProtocol {
    associatedtype P: Piyo
}

class Hoge<P: Pico>: HogeProtocol {
    typealias P = Piyo

    init() {
        Swift.print(type(of: P.self))
        Swift.print(type(of: Hoge.P.self))
    }
}

let hoge = Hoge()
結果
Pico.Type
Piyo.Type

P単体だとPicoとなっているため、ジェネリクスのプレースホルダの型の方が優先されているようです。typealiasの方にアクセスしたい場合は、Hoge.Pのように親を指定してあげれば良いようです。

Discussion