2015-05-22 9 views
22

Ho un rapido protocollo:Verificare se il metodo di protocollo opzionale è implementato in Swift?

@objc protocol SomeDelegate { 

    optional func myFunction() 

} 

ho una delle mie classi ho fatto:

weak var delegate: SomeDelegate? 

Ora voglio controllare se il delegate ha myFunction implementato.

in Objective-C che posso fare:

if ([delegate respondsToSelector:@selector(myFunction)]) { 
... 
} 

Ma questo non è disponibile a Swift.

Modifica: Questo è diverso da: What is the swift equivalent of respondsToSelector? Mi concentro sui protocolli di classe non sulle classi.

Come verificare se il mio delegato ha implementato un metodo opzionale?

+0

Sei sicuro che questa http://stackoverflow.com/a/27665147/1187415 o questa http://stackoverflow.com/a/28078301/1187415 risposta al thread di riferimento non risponda alla tua domanda? –

+0

Non ora quale versione di Swift era disponibile quando è stata posta la domanda, ma in swift 2.2 è possibile utilizzare respondsToSelector –

risposta

23

Per The Swift Programming Language:

di consultare le un'implementazione di un requisito opzionale scrivendo un punto interrogativo dopo il nome del requisito quando viene chiamato, come ad esempio someOptionalMethod? (SomeArgument). I requisiti della proprietà facoltativa ei requisiti del metodo facoltativo che restituiscono un valore, restituiscono sempre un valore facoltativo del tipo appropriato quando si accede o si chiama per riflettere il fatto che il requisito facoltativo potrebbe non essere stato implementato.

Quindi l'intenzione non è quella di verificare se il metodo è implementato, è che si tenta di chiamarlo a prescindere e ottenere un ritorno facoltativo.

+0

Voglio verificare se esistono metodi opzionali prima di chiamarlo. – confile

+2

Quindi probabilmente non vuoi usare Swift. Non è ciò che la lingua è creata per supportare. Qual è il tuo caso d'uso reale? – Tommy

+2

@confile: dai un'occhiata a * tutte * le risposte alla "domanda duplicata", ad esempio questa: http://stackoverflow.com/a/27665147/1187415.Mostra come testare prima se il delegato implementa il metodo e quindi chiamarlo. –

10

Si può fare

if delegate?.myFunction != nil { 

} 
+2

Che dire di un metodo sovraccarico? Possiamo farlo per cercare uno specifico? –

+0

Arresta il compilatore in Xcode 7.3 Beta se la funzione non è opzionale. Strano. –

7

ho trovato successo per aggiungere un'estensione del protocollo che definisce implementazione di default di base e quindi qualsiasi classe che implementa il protocollo deve ignorare solo le funzioni di interesse.

public protocol PresenterDelegate : class { 
     func presenterDidRefreshCompleteLayout(presenter: Presenter) 
     func presenterShouldDoSomething(presenter: Presenter) -> Bool 
    } 

quindi estendere

extension PresenterDelegate { 
     public func presenterDidRefreshCompleteLayout(presenter: Presenter) {} 
     public func presenterShouldDoSomething(presenter: Presenter) -> Bool { 
     return true 
     } 
    } 

Ora qualsiasi classe che necessitano di conformarsi al protocollo PresenterDelegate ha tutte le funzioni già implementate, quindi è ora opzionale di ignorare è la funzionalità.

+0

Sembra molto utile sapere, se posso ricordarlo solo quando ne ho bisogno :-) – clearlight

+0

Sì, ma come funziona se qualche pezzo di codice deve intervenire solo se la funzione è implementata? E non verrà compilato se '@ objc' è richiesto a causa di una parte del codice del protocollo che chiama #selector perché sta facendo qualcosa con l'interfaccia utente. Hmmm. – xaphod

Problemi correlati