2009-07-09 8 views
10

Sto imparando Objective-C al momento e ho trovato metodi opzionali nei protocolli. Il mio background è C# e può vedere un protocollo come qualcosa di simile all'interfaccia C#.Esempi reali di metodi di protocollo @optional

Se un'interfaccia C# rappresenta un contratto, pubblicizzando un'interfaccia si sta dicendo che implementerete i metodi definiti.

Con questo in mente sono confuso perché è necessario definire un metodo opzionale. Questo non è un insulto o un tentativo di ridurre l'obiettivo-C, adoro Objective-C. Voglio semplicemente comprendere i vantaggi di questi metodi facoltativi, al fine di ottenere una maggiore comprensione della lingua.

Apprezzerei molto se qualcuno potesse fornire alcuni scenari del mondo reale (con codice di esempio) in cui sono utili i metodi facoltativi.

risposta

14

Ti faccio un esempio. Ho un numero di classi ObjC che parlano con l'API di Flickr. Uno, chiamato FKAccount può fare un sacco di cose relative all'account di un utente di Flickr incluso il download delle foto dell'utente, il loro elenco di contatti e così via.

La classe FKAccount definisce un protocollo delegato FKAccountDelegate. Questo protocollo specifica un numero di metodi di callback che FKAccount invocherà sul proprio delegato a seconda del successo o dell'errore di varie operazioni di rete su Flickr. Non tutte le applicazioni che utilizzano FKAccount saranno interessate ad ogni operazione Flickr che può eseguire FKAccount.

Se fosse necessario che ogni classe che dichiara di implementare il protocollo FKAccountDelegate implementato ogni metodo, si potrebbe finire con un sacco di metodi stub (FWIW, ci sono 41 metodi definiti in FKAccountDelegate). Quando questi metodi sono dichiarati @optional nel protocollo, il delegato deve solo implementare i callback che è interessato a ricevere.

I FKAccount controlli di classe che il suo delegato risponde a @optional metodi nel protocollo per:

if([self.delegate respondsToSelector: @selector(accountDidDownloadContacts:)]) { 
    [self.delegate accountDidDownloadContacts: self]; 
} 
+0

penso che mi sto ora. Un'interfaccia C# è solo un aspetto di un protocollo Objective-C. È possibile utilizzare un protocollo come contratto, ma questi metodi facoltativi costituiscono un elenco di delegati facoltativi che un oggetto può scegliere di rispondere anche. È davvero interessante. – kim3er

+1

+1 per l'utilizzo di un protocollo per la documentazione delle funzioni dei delegati –

+1

Sono totalmente d'accordo con @Tom. Prima di Objective-C 2.0, i metodi delegate venivano di solito dichiarati in una categoria su NSObject per evitare che qualsiasi classe che vuole essere delegata debba implementare tutti i metodi. I metodi opzionali nei protocolli sono una soluzione molto più pulita che non appoggia tonnellate di metodi su NSObject e aiuta a evitare conflitti di metodo. Se solo Java avesse metodi di interfaccia opzionali, non ci sarebbe bisogno di cose come ereditare da MouseAdapter. Usare classi come queste di solito sono le poche volte in cui ho maledetto l'ereditarietà ... :-) –