wift - .self .Self


Dynamic MetaType vs. Static MetaType


.Typeはタイプです.selfはインスタンスです
let intMetatype: Int.Type = Int.self
type(of:)は動的要素タイプであり、.selfは静的要素タイプである.

Protocol Metatype

protocol MyProtocol {}

let metatype: MyProtocol.Type = MyProtocol.self   // 컴파일 불가
未コンパイルの理由:MyProtocol.タイプはプロトコル自体のメタクラス型を表さない
プロトコルのタイプを継承するメタクラス型です.存在メタタイプと呼ぶ
protocol MyProtocol {}

struct MyType: MyProtocol {}

let metatype: MyProtocl.Type = MyType.self    // 컴파일 성공
この場合、metaypeにアクセスできるのはMyProtocolのclass propertyとメソッドのみです(実際にはMyTypeの実装です)
protocol type自体の本当のタイプを得るためにプロトコルを追加すればいいです.(あまり使わない)
protocl MyProtocol {}

let protocolMetatype: MyProtocol.Protocol = MyProtocol.self

Self Type

Self型は特定のタイプではありません..typeの名前を知ったり書き換えたりする必要がなく、現在のタイプを簡単に指定できます.
しかしながら、プロトコルのSelfは、プロトコルの最終タイプに従うことを示す.

where Self:


ではprotocol ViewModelBindableType where Self: UIViewControllerの意味は
ViewModelBindableTypeに準拠するClass/structは、UI ViewControllerを継承するClass/structである必要があります.
次のコードを分析してみましょう.
protocol ViewModelBindableType where Self: UIViewController {
    associatedtype ViewModelType
    var viewModel: ViewModelType! { get set }
    func bindViewModel()

    mutating func bind(to viewModel: Self.ViewModelType) {
        self.viewModel = viewModel
        loadViewIfNeeded()
        bindViewModel()
        //개별 vc에서 bindViewModel()을 직접 호출할 필요가 없기때문에 코드가 단순해짐
    }
}
associatedtypeはGenericであり、モードのタイプによって決まる.
ViewControllerクラスがViewModelBindableTypeを実装する場合、viewModelおよびbindViewModelをクラスに実装する必要がある.bind(to viewModel: Self.ViewModelType)関数は、ViewControllerインスタンスに直接使用することができる.
パラメータとしてのViewModelのタイプは、このプロトコルを継承するViewControlのViewModelのタイプと一致する必要があります(associatedtypeはJENICです).
このコードの結果として、パラメータであるViewModelは、ViewControllerのViewModelに割り当てられる(このプロトコルを継承して強制的に実施する必要がある).