2014-11-09 14 views
10

Ich möchte eine NSObject-Unterklasse für die Initialisierung ohne Parameter einen fehlbaren Initialisierer bereitstellen. Mein übergeordnetes Ziel ist die Rückgabe von nil, wenn diese Klasse auf einer Betriebssystemversion kleiner als 8.0 initialisiert wird.Parameterless Failable Initialisierer für eine NSObject-Unterklasse

bei dieser Mein Versuch ist unter:

class MyObject: NSObject { 
    override init?() { 
     super.init() 
     if floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1 { 
      return nil 
     } 

    } 
} 

jedoch Dieser Code führt die folgenden Compiler-Fehler.

Ist es möglich, init() zu überschreiben, um eine fehlbare Implementierung in einer Unterklasse bereitzustellen? Oder gibt es einen besseren Weg, dieses Ziel zu erreichen?

Antwort

3

Da Sie NSObject unterklassifizieren, können Sie keinen fehlbaren Nicht-Parameter-Initialisierer haben, da NSObjects kein Parameter-Initialisierer nicht ablehnbar ist.

Sie könnten eine Klasse Factory-Methode erstellen, die eine Instanz oder null auf der iOS-Version abhängig gibt

4

Da:

Sie einen failable initializer mit einem nonfailable initializer außer Kraft setzen kann, aber nicht in die andere Richtung um.

und

A failable initializer kann auch auf einen nonfailable initializer delegieren. Verwenden Sie diesen Ansatz, wenn Sie einem vorhandenen Initialisierungsprozess einen potenziellen Fehlerstatus hinzufügen müssen, der andernfalls nicht fehlschlägt.

(Auszüge aus Failable Initializers)

und unter Berücksichtigung, dass NSObject keine parameterlos failable initializer hat, dann nein, man kann nicht einen nicht failable initializer mit einem failable initializer außer Kraft setzen.

Die einzige Option, die ich sehe, ist eine Initialisierung mit einem Dummy-Parametern zu erstellen, wie:

class MyObject: NSObject { 
    init?(_ ignore: Bool) { 
     super.init() 
     if floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1 { 
      return nil 
     } 
    } 
} 

und deren Verwendung dann als:

var myObj = MyObject(true) 

oder

var myObj = MyObject(false) 

Mehr Interessanterweise Zuweisung eines Default-Wertes zum Dummyparameter s macht den Job ziemlich gut:

class MyObject: NSObject { 
    init?(_ ignore: Bool = false) { 
     super.init() 
     if floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1 { 
      return nil 
     } 
    } 
} 

var myObj = MyObject() 
+0

Danke für die kreative Arbeit um mein Problem herum. Wenn ich jedoch mehr darüber nachdenke, denke ich, dass eine Fabrikmethode (z. B. Pauls Vorschlag) hier die sauberere Lösung sein könnte. –

+1

Diese Dummy-Parameter-mit-einem-Standard-Wert-Lösung ist böse, aber brillant. –

Verwandte Themen