2017-02-12 70 views
2

我在Swift中有點新。 我有一些方法,以相同的方式顯示在少數類中,但只有不同的類型。它看起來像這樣:Swift - 加載類動態類型

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() 
    } 
} 

正如你可以看到,這兩種方法是相同的。但我必須在每個班級寫下他們,但是有不同的類型。

是否可以編寫一個「動態」靜態(或非靜態)方法在一個地方完成,而不必在每個類中一次又一次地編寫此方法?

回答

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迫使每個子類中以某種方式實現它。但是,如果它是繼承的,那也沒關係。請記住,如果你創建了自定義的指定初始值設定項,那麼你將失去所有你繼承的初始值設定項,因爲它們不再有效(它們不會調用你指定的初始值設定項,你說這是必須的;這就是「指定初始值設定項」)。 required確保我們依賴的初始化實際存在並且沒有以這種方式丟失。