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に割り当てられる(このプロトコルを継承して強制的に実施する必要がある).
Reference
この問題について(wift - .self .Self), 我々は、より多くの情報をここで見つけました https://velog.io/@bbuyo/Swift-.self-.Selfテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol