Come creare un protocollo con metodi facoltativi?


133

Ho notato i metodi contrassegnati come facoltativi in ​​diversi protocolli definiti nell'SDK di iPhone, come ad esempio il UIActionSheetDelegateprotocollo.

Come posso definire un mio protocollo e impostare alcuni metodi come facoltativi?

Risposte:


248

Dalla pagina Apple su " Protocolli formali ":

I metodi del protocollo opzionale possono essere contrassegnati come facoltativi utilizzando la parola chiave @optional. Corrispondente alla parola chiave modale @optional, esiste una parola chiave @required per indicare formalmente la semantica del comportamento predefinito. Puoi usare @optional e @required per partizionare il protocollo in sezioni come meglio credi. Se non si specifica alcuna parola chiave, l'impostazione predefinita è @required.

@protocol MyProtocol

- (void)requiredMethod;

@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;

@required
- (void)anotherRequiredMethod;

@end

4
nota che: la direttiva '' '@optional' '' e '' '@required' '' si applica a tutti i metodi che la seguono.
Wayne,

31

Se un metodo in un protocollo è contrassegnato come facoltativo, è necessario verificare se un oggetto implementa quel metodo prima di tentare di chiamarlo.

Ad esempio, la vista del grafico a torta potrebbe verificare il metodo del titolo del segmento in questo modo:

NSString *thisSegmentTitle;
if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
    thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
}

RespondsToSelector: il metodo utilizza un selettore, che fa riferimento all'identificatore per un metodo dopo la compilazione. È possibile fornire l'identificatore corretto utilizzando la direttiva @selector () e specificando il nome del metodo.

Se l'origine dati in questo esempio implementa il metodo, viene utilizzato il titolo; in caso contrario, il titolo rimane nullo.


7
Assicurati di estendere NSObject nel protocollo per utilizzare
respondsToSelector

1
Giusto, come@protocol MyProtocol <NSObject>
Lawrence Kesteloot,

Questa è una risposta perfetta!
smoothdvd il

14

Protocolli è un insieme di regole. Possiamo creare protocolli come nell'esempio seguente:

TestProtocols.h

@protocol TestProtocols <NSObject>
    @optional
    -(void)testMethodOptional;

    @required  // by default
    -(void)testMethodRequired;
@end

Implementazione:

TestClass.h

#import "TestProtocols.h"
@interface TestClass : NSObject  <TestProtocols>

@end

TestClass.m

#import "TestClass.h"
@implemenation TestClass
    //optional to implement 
    -(void)testMethodOptional{
     // Your Code
    }

    //required to implement 
    -(void)testMethodRequired{
     // Your Code
    }
@end

12

Utilizzare la @optionalparola chiave prima della dichiarazione del metodo per renderla facoltativa. Semplice come quella!

// myProtocol.h
@protocol myProtocol
- (void)myMandatoryMethod:(id)someArgument;
@optional
- (void)myOptionalMethod:(id)someArgument;
@end
// myClass.m
@interface myClass : someSuperClass <myProtocol>
    //...
@end

6

I protocolli funzionano allo stesso modo delle classi astratte, quindi la parola chiave @optional definisce quei metodi che sono opzionali per l'implementazione.

Quindi, nel codice, someMethod1, someMethod2 e someMethod4 sono metodi obbligatori (devono essere implementati). someMethod3 è facoltativo: se non implementiamo questo metodo, il compilatore non genererà alcun avviso.

@protocol myPrtocol<NSObject>

-(void)someMethod1:(id)someArgument;
-(void)someMethod2:(id)someArugument;

@optional

-(void)someMethod3:(id)someArgument;

@required //by default

-(void)someMethod4:(id)someArgument;

@end

// sampleClass.m
@interface sampleClass : someSuperClass <myProtocol>
//...
@end
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.