2016-05-23 12 views
6

Non riesco a sovrascrivere il seguente metodo e ho creato un esempio indipendente che mi ha tormentato per alcune ore.Sovrascrivere un metodo di classe Obj-C da Swift che restituisce NSArray

È quasi certamente una cosa sciocca, ma non riesco a sovrascrivere un metodo di classe in una classe veloce, dove la classe base è Objective C, e in particolare il tipo restituito è un NSArray*.

ottengo solo l'errore, "Method does not override any method from its superclass"

Quindi il mio fallimento è la seguente:

Error shown, with definition of class and superclass

Ma funziona bene se il tipo restituito è cambiato in qualcosa di semplice come NSString *

Working example with NSString

Ora ho provato Array<AnyObject> ep gettato in giro con un paio di altri, ma sono ancora un po 'fresco con la sintassi Swift quindi mi mancherà quasi certamente qualcosa di ovvio.

+0

@Kex come vorrei che risolvere il problema? L'utente sta cercando di implementare un metodo di classe. – JAL

risposta

5

NSArray * viene ponticellato a Swift come [AnyObject]! (un istanze implicite). Guarda l'interfaccia Swift generato per [ExampleBase exampleMethod]:

ExampleBase

modificare il tipo di metodo di ritorno a [AnyObject]!.

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

Per specificare un valore opzionale o cemento nella sottoclasse Swift, utilizzare uno specificatore Objective-C nullability:

+ (NSArray * _Nonnull)exampleMethod; ponti per override class func exampleMethod() -> [AnyObject]

+ (NSArray * _Nullable)exampleMethod; ponti per override class func exampleMethod() -> [AnyObject]?

+ (NSArray *)exampleMethod; e + (NSArray * _Null_unspecified)exampleMethod; avere un comportamento identico e collegarsi a un opzionale implicitamente non imballato.

+0

Grazie per la risposta, ho pensato di averlo provato! Ma mi ero perso il! Alla fine. Un buon consiglio per controllare la definizione, non ho idea del perché non l'ho provato. –

3

Una soluzione è fornire al compilatore maggiori informazioni sul tipo.

Nel objC dichiarare il metodo

+ (NSArray<NSString *>*)exampleMethod; 

poi a Swift è possibile scrivere

override class func exampleMethod() -> [String] 
Problemi correlati