2017-11-13 8 views
1

メモリポインタが型にバインドされているメタルサンプルのコード行と混同されています。.self Swiftのstruct型の後

uniforms = UnsafeMutableRawPointer(uniformBuffer.contents()).bindMemory(to: Uniforms.self, capacity: 1) 

私の混乱はUniforms型の後.selfです。 Uniformsは、Objective-Cファイルで定義された構造体であり、コードは.selfが呼び出されずに実行されることはありません。それはなぜ必要なのですか?

答えて

2

.selfは、対応するタイプののメタタイプインスタンスを返します。タイプセーフな型の識別子と考えることができます(例:文字列を使用するよりも安全です)。そうすれば、使用可能な初期化子、静的メソッド、そのようなメタタイプのインスタンスの静的プロパティを安全に呼び出すことができます。

たとえば、あなたはそれは同様に変数に格納することができ:

let metatype: Uniforms.Type = Uniforms.self 

Uniforms.Type実際メタタイプ(すなわち、種類のタイプ)です。

メタタイプクラッシュコース。非常に簡単な例では、このメタなものは、実際に役に立つかもしれない方法の感触を取得します

class Super { 
    let id: Int 
    required init(id: Int) { self.id = id } 
} 

class SubA: Super { ... } 
class SubB: Super { ... } 

let subclass: Super.Type = SubA.self 

してから、後で、実際のサブクラスタイプ名ハードコーディングせずにインスタンスを作成するためにsubclassを使用します。

let obj = subclass.init(id: 123) // new SubA instance. 
1

Swiftでは、.selfをメタタイプの抽出に使用することも、タイプのインスタンス上で使用することもできます。たとえば、.selfを使用してメタタイプを取得し、APIに渡します。

self.tableView.registerClass(
    UITableViewCell.self, forCellReuseIdentifier: "myUIViewCell") 
関連する問題