2017-06-16 10 views
1

super.init()が呼び出される前に、イニシャライザ内の動的な型のクラスにアクセスしたいと思います。私はそれが不可能だと思う。しかし、動的クラスは、スーパークラスの中でコンパイル時に知るべきものです。 Swiftコンパイラがアクセス権を与えないものです。または方法がありますか?Swift 3でsuper.initより前の動的型にアクセスする方法

typealias JSONDict = [String: Any] 

class BaseItem: NSObject { 
    class var apiName: String { return "n/a" } 

    init?(json: JSONDict) { 
     // I need to access dynamic type before super.init(). 
     // I can only access current type statically. 
     print("api name before: " + BaseItem.apiName) 
     // Prints "n/a", I need it to print "book". 

     super.init() 

     // This correctly prints "book". 
     print("api name: " + type(of: self).apiName) 
    } 
} 

class Book: BaseItem { 
    override class var apiName: String { return "book" } 
} 

let b = Book(json: [:]) 

このサンプルコードは、遊び場にコピーすることができます。

答えて

1

あなたは、インスタンスが完全に初期化される前であっても、initメソッドでtype(of: self)を使用することができます。

typealias JSONDict = [String: Any] 

class BaseItem: NSObject { 
    class var apiName: String { return "n/a" } 

    init?(json: JSONDict) { 
     print("api name: " + type(of: self).apiName) 
     super.init() 
    } 
} 

class Book: BaseItem { 
    override class var apiName: String { return "book" } 
} 

let b = Book(json: [:]) 
// api name: book 
+0

うわー!自分のプロジェクトで初期化され、サンプルの遊び場で試してみる前に、自分で警告を見たことを誓っています。私はプロジェクトでそれを試して、それは動作します。それとも、私はそれを試すことさえしないかもしれません。なぜなら私の脳はあなたが生まれる前に自己を使うことができないことを知っているからです。私は馬鹿だと感じる。答えをありがとう! –

関連する問題