Risposte:
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
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.
@protocol MyProtocol <NSObject>
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
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
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