2016-05-10 9 views
0

ich von iOS-nRF-Toolboxeine Bequemlichkeit initializer Erweiterung für Objective-C-Klasse Hinzufügen zu

Klasse ScannedPeripheral enthält einen Initialisierer

+ (ScannedPeripheral*) initWithPeripheral:(CBPeripheral*)peripheral rssi:(int)RSSI isPeripheralConnected:(BOOL)isConnected NS_REFINED_FOR_SWIFT; 

ich es wie dieses

in Swift verwenden einige Code in Swift verwendet werden anrufen
ScannedPeripheral.initWithPeripheral(peripheral, rssi: 0, isPeripheralConnected: true) 

Aber es sieht nicht gut aus. Wie macht Apple seine Cocoa-API?

Ich versuchte, die initializer mit NS_REFINED_FOR_SWIFT und fügt eine Swift-Erweiterung zu markieren:

extension ScannedPeripheral { 
    convenience init(peripheral: CBPeripheral, rssi: Int32, isPeripheralConnected: Bool) { 
     ScannedPeripheral.__initWithPeripheral(peripheral, rssi: rssi, isPeripheralConnected: isPeripheralConnected); 
    } 
} 

Aber jetzt ein Fehler sagt Self.init isn't called on all paths before returning from initializer.

+0

Hallo, ist es eine statische Methode, den folgenden Code verwenden wird es funktionieren. –

+0

Es ist eine statische Funktion (Klassenfunktion), wir können keine Instanzeigenschaften (self) in statischen Funktionen verwenden. –

+0

OK es sollte automatisch konvertiert werden Swift ohne Funktion wird in "init blah" umbenannt. Der Grund dafür ist, dass es sich um statische Methoden handelt, die wahrscheinlich nicht sehr orthodox sind. – huggie

Antwort

1

Ich denke, es ist besser, Unterklasse für ScannedPeripheral anstelle von Erweiterung zu schreiben, da Erweiterungen möglicherweise nicht für Initialisierer und Override-Methoden unterstützen.

eample

class SubClassScannedPeripheral: ScannedPeripheral { 
    override class func initWithPeripheral(peripheral: CBPeripheral, rssi: Int32, isPeripheralConnected: Bool) -> ScannedPeripheral { 
    return ScannedPeripheral.initWithPeripheral(peripheral, rssi: rssi, isPeripheralConnected: isPeripheralConnected); 
} 
} 
+0

Wie macht Apple dann mit Cocoa API? Es sieht nicht nach Sub-Classing aus. – huggie

+0

ja, sie haben neue Initialisierer mit Komfort-Schlüsselwort verwendet, da sie die Initialisierer dieser Klasse aufrufen können, aber hier versuchen Sie, die Klassenfunktion zu übersteuern, die kein Initialisierer ist. –

+0

Ich verstehe nicht, was Sie gesagt haben. Aber vielleicht gibt deine Klasse mir nicht, was ich will. Zum Beispiel ist der UIView-Initialisierer 'UIView (frame: cgrect)'. Nicht SubUIView (frame: cgrect). – huggie

Verwandte Themen