Objective-C Language
protokoll
Sök…
Grundläggande protokolldefinition
Definiera ett nytt protokoll:
@protocol NewProtocol
- (void)protocolMethod:(id)argument;
- (id)anotherMethod;
@end
Valfria och erforderliga metoder
Som standard krävs alla metoder som deklareras i ett protokoll. Detta innebär att varje klass som överensstämmer med detta protokoll måste implementera dessa metoder.
Det är också möjligt att förklara valfria metoder. Denna metod kan endast implementeras vid behov.
Du markerar valfria metoder med @optional
.
@protocol NewProtocol
- (void)protocolMethod:(id)argument;
@optional
- (id)anotherMethod;
@end
I detta fall är endast en anotherMethod
markerad som valfri; metoderna utan @optional
antas vara nödvändiga.
@optional
direktivet gäller för metoder som följer, fram till slutet av protokolldefinitionen eller tills ett annat direktiv hittas.
@protocol NewProtocol
- (void)protocolMethod:(id)argument;
@optional
- (id)anotherMethod;
- (void)andAnotherMethod:(id)argument;
@required
- (void)lastProtocolMethod;
@end
Detta sista exempel definierar ett protokoll med två valfria metoder och två obligatoriska metoder.
I enlighet med protokoll
Följande syntax indikerar att en klass antar ett protokoll med vinkelparenteser.
@interface NewClass : NSObject <NewProtocol>
...
@end
Detta innebär att alla instanser av NewClass kommer att svara på metoder som deklareras i dess gränssnitt men också att det kommer att ge en implementering av alla nödvändiga metoder för NewProtocol
.
Det är också möjligt för en klass att anpassa sig till flera protokoll genom att separera dem med komma.
@interface NewClass : NSObject <NewProtocol, AnotherProtocol, MyProtocol>
...
@end
Liksom vid överensstämmelse med ett enda protokoll måste klassen implementera varje nödvändig metod i varje protokoll, och varje valfri metod du väljer att implementera.
Framåtförklaringar
Det är möjligt att förklara protokollnamn utan metoder:
@protocol Person;
använd den din kod (klassdefinition, etc):
@interface World : NSObject
@property (strong, nonatomic) NSArray<id<some>> *employees;
@end
och definiera senare protokollets metod någonstans i din kod:
@protocol Person
- (NSString *)gender;
- (NSString *)name;
@end
Det är användbart när du inte behöver veta protokollinformation förrän du importerar den filen med protokolldefinition. Så din klasshuvudfil förblir klar och innehåller bara detaljer om klassen.
Kontrollera existerande implementering av valfri metod
if ([object respondsToSelector:@selector(someOptionalMethodInProtocol:)])
{
[object someOptionalMethodInProtocol:argument];
}
Kontrollera överensstämmelse med protokoll
Returnerar en boolean som anger om klassen överensstämmer med protokollet:
[MyClass conformsToProtocol:@protocol(MyProtocol)
];