Objective-C Language
protocolli
Ricerca…
Definizione del protocollo di base
Definire un nuovo protocollo:
@protocol NewProtocol
- (void)protocolMethod:(id)argument;
- (id)anotherMethod;
@end
Metodi opzionali e richiesti
Per impostazione predefinita, sono richiesti tutti i metodi dichiarati in un protocollo. Ciò significa che qualsiasi classe conforme a questo protocollo deve implementare tali metodi.
È anche possibile dichiarare metodi opzionali . Questo metodo può essere implementato solo se necessario.
Contrassegni i metodi opzionali con la direttiva @optional
.
@protocol NewProtocol
- (void)protocolMethod:(id)argument;
@optional
- (id)anotherMethod;
@end
In questo caso, solo anotherMethod
è contrassegnato come facoltativo; si presume che i metodi senza la direttiva @optional
siano obbligatori.
La direttiva @optional
applica ai metodi che seguono, fino alla fine della definizione del protocollo o fino a quando non viene trovata un'altra direttiva.
@protocol NewProtocol
- (void)protocolMethod:(id)argument;
@optional
- (id)anotherMethod;
- (void)andAnotherMethod:(id)argument;
@required
- (void)lastProtocolMethod;
@end
Questo ultimo esempio definisce un protocollo con due metodi opzionali e due metodi richiesti.
Conformandosi ai protocolli
La seguente sintassi indica che una classe adotta un protocollo, usando parentesi angolari.
@interface NewClass : NSObject <NewProtocol>
...
@end
Ciò significa che qualsiasi istanza di NewClass risponderà ai metodi dichiarati nella sua interfaccia ma fornirà anche un'implementazione per tutti i metodi richiesti di NewProtocol
.
È anche possibile che una classe si conformi a più protocolli, separandoli con una virgola.
@interface NewClass : NSObject <NewProtocol, AnotherProtocol, MyProtocol>
...
@end
Come quando si conforma ad un singolo protocollo, la classe deve implementare ogni metodo richiesto da ciascun protocollo e ogni metodo opzionale che si sceglie di implementare.
Dichiarazioni avanti
È possibile dichiarare il nome del protocollo senza metodi:
@protocol Person;
usa il tuo codice (definizione della classe, ecc.):
@interface World : NSObject
@property (strong, nonatomic) NSArray<id<some>> *employees;
@end
e in seguito definire il metodo del protocollo da qualche parte nel codice:
@protocol Person
- (NSString *)gender;
- (NSString *)name;
@end
È utile quando non è necessario conoscere i dettagli dei protocolli finché non si importa quel file con la definizione del protocollo. Pertanto, il file di intestazione della classe rimane chiaro e contiene solo i dettagli della classe.
Verifica dell'esistenza di implementazioni del metodo opzionali
if ([object respondsToSelector:@selector(someOptionalMethodInProtocol:)])
{
[object someOptionalMethodInProtocol:argument];
}
Verifica il protocollo conforme
Restituisce un booleano che indica se la classe è conforme al protocollo:
[MyClass conformsToProtocol:@protocol(MyProtocol)
];