2016-02-03 19 views
6

In Swift, lassen Sie uns sagen, dass ich eine statische Factory-Methode hinzufügen möchten, die eine Instanz zurückgibt:Swift: Holen Sie sich aktuelle Klasse aus einer statischen Methode

class MyClass { 
    static func getInstance() { 
    return MyClass(someProperty); 
    } 
} 

Aber was, wenn ich will nicht den Klassennamen schreiben ? Gibt es ein Äquivalent von self, aber für statische Methoden und Eigenschaften?

Gleiche Idee, wenn ich eine andere statische Methode aus einer statischen Methode aufrufen wollen:

class MyClass { 
    static func prepare(){ 
    //Something 
    } 

    static func doIt() { 
    MyClass.prepare(); 
    } 
} 

Kann ich dies tun, ohne MyClass explizit mit?

Antwort

4

selbst arbeitet in statischen Methoden auch wie folgt aus:

class MyClass { 
    static func prepare(){ 
    print("Hello"); 
    } 

    static func doIt() { 
    self.prepare(); 
    } 
} 
+0

Dank. Was ist mit 'self()'? Ich bekomme einige Fehler, die sagen, ich brauche 'self.init', und wenn ich tue, bekomme ich einen anderen Fehler, dass ich einen' erforderlichen' Initialisierer brauche ... –

+0

self() ist nicht möglich, aber ich frage mich, warum willst du das zu tun? dfri beschreibt die Best Practice oben, um Factory Design Pattern zu erstellen. Hier ist ein weiteres Beispiel: https://github.com/ochococo/Design-Patterns-In-Swift/blob/master/source/creational/factory.swift – RobbeR

+0

Der einzige Grund, den ich das tue, ist, weil der Code kopiert wird und verteilt für andere Leute zu verwenden. Ich dachte, die wenigsten Dinge würden besser codiert ... Danke! –

0

Wie RobberR oben schreibt, die Sie gerade self für den Zugriff auf statische Funktion von self und self.init(...) für Ihre Fabrik Beispiel nutzen könnten. Beachten Sie, dass Sie in Ihrer Factory-Methode weiterhin MyClass als Rückgabetyp angeben müssen.

Als Alternative, allgemeinerer Ansatz, könnten Sie Ihre Klasse einem Factory-Protokoll anpassen lassen, das eine Standardimplementierung für die Factory-Methode enthält. Damit ist die statische Factory-Methode nicht an eine bestimmte Klasse gebunden, sondern kann von jeder Klasse, die dem Factory-Protokoll entspricht (und einem zusätzlichen Hilfeprotokoll für allgemeine Initialisierer), auf zugreifen.

Werkseinstellung:

protocol FactoryInitializers { 
    var commonProperty : Int { get set } 
    init(commonProperty: Int) 
} 

protocol FactoryMethods { 
    typealias T: FactoryInitializers 
    static var defaultStaticCommonProperty : Int { get } 
} 
extension FactoryMethods { 
    static func getInstance() -> T { 
     return T(commonProperty: defaultStaticCommonProperty) 
    } 
    static func getInstanceFor(commonProperty commonProperty: Int) -> T { 
     return T(commonProperty: commonProperty) 
    } 
} 

protocol Factory : FactoryMethods, FactoryInitializers { } 

Beispiel Klasse Einhaltungen:

class MyClass : Factory { 
    typealias T = MyClass 
    static var defaultStaticCommonProperty : Int = 1 

    var commonProperty : Int = 0 

    required init(commonProperty: Int) { 
     self.commonProperty = commonProperty 
    } 
} 

class MyOtherClass : Factory { 
    typealias T = MyOtherClass 
    static var defaultStaticCommonProperty : Int = 10 

    var commonProperty : Int = 0 

    required init(commonProperty: Int) { 
     self.commonProperty = commonProperty 
    } 
} 

Beispiel Nutzung:

var foo = MyClass.getInstance() 
print(foo.dynamicType) // "MyClass" 
print(foo.commonProperty) // 1 
foo = MyClass.getInstanceFor(commonProperty: 5) 
print(foo.commonProperty) // 5 

var bar = MyOtherClass.getInstance() 
print(bar.dynamicType) // "MyOtherClass" 
print(bar.commonProperty) // 10 
0

Sie ein Protokoll definieren und verwenden Sie die swift generics wie folgt aus:

protocol Vehicle { 
    init() 
} 

class MyVehicleFactory<T:Vehicle> { 
    static func getInstance() -> T { 
    return T() 
    } 
} 

Und die Leute, die den Code kopiert wird, kann dies tun:

class Car : Vehicle { 
    required init() { } 
} 
let car = MyVehicleFactory<Car>.getInstance(); 
Verwandte Themen