2017-02-12 3 views
2

スウィフトではちょっと新しくなりました。 同じ方法でいくつかのクラスでいくつかのメソッドを示していますが、異なるタイプのメソッドしかありません。これは次のようになります。ダイナミックタイプのスウィフトロードクラス

class func loadDevice() -> Device 
{ 
    let object = super.loadFromDisk() 
    if object != nil 
    { 
     return object! as! Device 
    } 
    else 
    { 
     return Device.init() 
    } 
} 



class func loadUser() -> User 
{ 
    let object = super.loadFromDisk() 
    if object != nil 
    { 
     return object! as! User 
    } 
    else 
    { 
     return User.init() 
    } 
} 

これらの2つの方法は同じです。しかし、私はそれらをすべてのクラスに書かなければならないが、異なるタイプで書かなければならない。

このメソッドをすべてのクラスに何度も何度も書き込むことなく、1か所で行う動的(静的ではない)メソッドを記述できますか?

答えて

3

こちらのツールはSelfです。

class Thing { 
    class func loadFromDisk() -> Self? { 
     // Do something to load from disk, or return nil if you can't 
     // subclasses can override this if appropriate 
     return nil 
    } 

    class func create() -> Self { 
     // Try to load it from disk, but if we can't, create one 
     return loadFromDisk() ?? self.init() 
    } 

    required init() {} 
} 

class User: Thing {} 

init方法は何とかそれを実装するために、すべてのサブクラスを強制的にrequiredをマークされています。しかし、継承されていればOKです。カスタム指定イニシャライザを作成すると、継承されたイニシャライザはもはや有効ではないため、すべて失われます(指定されたイニシャライザを呼び出さず、必須のイニシャライザと呼ばれています)。 requiredは、私たちが依存しているイニシャライザが実際に存在し、この方法で失われていないことを確認します。

関連する問題