2016-05-23 9 views
6

Ich scheine die folgende Methode nicht zu überschreiben und habe ein eigenständiges Beispiel erstellt, das mich seit ein paar Stunden belästigt.Überschreibe eine Obj-C-Klassenmethode von Swift, die NSArray zurückgibt

Es ist fast sicher etwas albern, aber ich scheinen nicht in der Lage, eine Klassenmethode in einer swift-Klasse zu überschreiben, wo die Basisklasse Objective C ist, und der Rückgabetyp ist ein .

ich nur den Fehler, „Method does not override any method from its superclass

So ist mein Versagen unten gezeigt:

Error shown, with definition of class and superclass

Aber es funktioniert gut, wenn der Rückgabetyp auf etwas Einfaches wie NSString *

geändert wird

Working example with NSString

Jetzt habe ich versucht Array<AnyObject> und p Ich habe mich mit ein paar anderen herumgetrieben, aber ich bin immer noch ein bisschen frisch mit der Swift-Syntax, also vergesse ich mit Sicherheit etwas Offensichtliches.

+0

@Kex schreiben kann, wie sich das Problem lösen würde? Der Benutzer versucht eine Klassenmethode zu implementieren. – JAL

Antwort

5

NSArray * wird mit Swift als [AnyObject]! überbrückt (eine implizit unverpackte Array von AnyObject Instanzen). Schauen Sie sich die erzeugte Swift-Schnittstelle für [ExampleBase exampleMethod]:

ExampleBase

Ihre Methode Rückgabetyp zu [AnyObject]! ändern.

override class func exampleMethod() -> [AnyObject]! { 
    return [] 
} 

Um einen optionalen oder konkreten Wert in Ihrer Swift Unterklasse angeben, verwenden Sie eine Objective-C NULL-Zulässigkeit Spezifizierer:

+ (NSArray * _Nonnull)exampleMethod; Brücken override class func exampleMethod() -> [AnyObject]

+ (NSArray * _Nullable)exampleMethod; Brücken override class func exampleMethod() -> [AnyObject]?

+ (NSArray *)exampleMethod; und + (NSArray * _Null_unspecified)exampleMethod; haben das gleiche Verhalten und überbrücken zu einem implizit-unwrapped optional.

+0

Danke für die Antwort, ich dachte, ich hätte das probiert! Aber ich hatte das verpasst! Am Ende. Guter Tipp, um die Definition zu überprüfen, keine Ahnung, warum ich das nicht versucht habe. –

3

Eine Lösung besteht darin, dem Compiler mehr Informationen über den Typ zu geben.

In ObjC erklären die Methode

+ (NSArray<NSString *>*)exampleMethod; 

dann in Swift Sie

override class func exampleMethod() -> [String] 
Verwandte Themen