2015-06-29 3 views
6

Ok ecco il grosso problema. Ho avuto una biblioteca scritta in ObjC (this). Lì avevamo un protocollo definito. Quando ho provato ad usarlo in file di rapida ottengo sempre:Protocollo ObjC Implementazione in Swift

tipo "XXX" non è conforme al protocollo "XXX"

Per semplificare le cose che ho fatto un progetto di test - dovrebbe essere creato come progetto Swift.

Poi creare file di intestazione objC (ho chiamato StupidProtocol.h) con seguente protocollo interno (si prega di notare ogni nome e il valore in modo che corrisponda esattamente la data compresi maiuscole/minuscole):

@protocol MyProtocol <NSObject> 

- (NSString *)getAxisLabel:(id)axis Value:(CGFloat)value; 

@end 

a colmare intestazione:

#import "StupidProtocol.h" 

E poi di nuovo nel file di Swift:

class ViewController: UIViewController, MyProtocol 
{ 
    func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! { 
     return "" 
    } 
} 

E baam abbiamo ancora questo errore, anche se il completamento automatico termina per me la funzione getAxisLabel.

Ho il forte sospetto che il problema sia con l'argomento "valore" e il suo parametro di funzione "Valore".

Qualsiasi aiuto sarà molto apprezzato.

EDIT

prega di notare che this library non è tecnicamente il mio, quindi non posso cambiarlo. Ho bisogno di un modo per usarlo in Swift senza cambiare la sua dichiarazione originale. Il mio esempio è solo per semplificare il mio problema.

quello che ho cercato

Ho provato seguenti scenari senza successo:

'ha il nome argomenti diversi da quelli previsti dal protocollo n' errore

func getAxisLabel(axis: AnyObject!, Value value: CGFloat) -> String! { 
    return "" 
} 

'ha nome diverso argomenti da quelli richiesto dall'errore del protocollo

func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> String! { 
    return "" 
} 

'ty pe non è conforme al protocollo'

func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> NSString! { 
    return "" 
} 

SOLUZIONE

Vedi accepted answer

+0

Obj c è maiuscola V e veloce è minuscola v Verificare entrambi in minuscolo.. Dovrebbe essere in minuscolo in entrambi. – Fogmeister

+0

provare a scrivere il metodo rapido con il nome param esterno "Valore" e il nome param interno di "valore" come: "Valore valore: CGFloat" – hola

+0

Ciò potrebbe risolvere il problema ma non si dovrebbe avere la V maiuscola in primo luogo. Rilascia e funzionerà. – Fogmeister

risposta

9

Non so se questo è un bug o no.Il metodo di protocollo Objective-C

- (NSString *)getAxisLabel:(id)axis Value:(CGFloat)value; 

(con maiuscola "V" in Value:) si associa a Swift come

func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! 

(con minuscola "v" in value:), ma nessuno di

func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! { } 
func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> String! { } 

è accettato dal compilatore per soddisfare i requisiti del protocollo.

Per risolvere il problema, è possibile annotare il metodo con una Objective-C nome esplicito selettore:

class ViewController: UIViewController, MyProtocol 
{ 
    @objc(getAxisLabel:Value:) 
    func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! { 
     return "" 
    } 
} 
+1

Sei un risparmiatore di vita! Sapevo che avrebbe dovuto essere qualcosa con la parola chiave @objc come soluzione alternativa, ma non sapevo come usarlo esattamente. Ottimo da sapere anche per riferimenti futuri! –