2017-02-12 3 views
2

Ich bin ein bisschen neu in Swift. Ich habe eine Methode, die in wenigen Klassen auf die gleiche Weise zeigt, aber nur mit unterschiedlichen Typen. Es sieht wie folgt aus:Swift - Lastklasse nach dynamischem Typ

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

Da u sehen können, diese zwei Methoden sind die gleichen. aber ich muss sie in jeder Klasse schreiben, aber mit verschiedenen Typen.

Ist es möglich, eine "dynamische" statische (oder nicht statische) Methode zu schreiben, die es an einer Stelle macht, ohne diese Methode in jeder Klasse immer wieder zu schreiben?

Antwort

3

Das gewünschte Werkzeug ist 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 {} 

Die init Methode wird required markiert jede Unterklasse zu zwingen, es irgendwie zu implementieren. Es ist in Ordnung, wenn es vererbt wird, obwohl. Denken Sie daran, wenn Sie benutzerdefinierte designierte Initialisierer erstellen, verlieren Sie alle geerbten Initialisierer, da sie nicht mehr gültig sind (sie rufen nicht Ihren Initialisierer auf, den Sie als obligatorisch bezeichneten; das ist ein "designierter Initialisierer"). required stellt sicher, dass der Initialisierer, auf den wir uns verlassen, tatsächlich existiert und nicht auf diese Weise verloren gegangen ist.