Objective-C Language
Protokoły
Szukaj…
Podstawowa definicja protokołu
Definiowanie nowego protokołu:
@protocol NewProtocol
- (void)protocolMethod:(id)argument;
- (id)anotherMethod;
@end
Opcjonalne i wymagane metody
Domyślnie wymagane są wszystkie metody zadeklarowane w protokole. Oznacza to, że każda klasa zgodna z tym protokołem musi implementować te metody.
Możliwe jest również zadeklarowanie metod opcjonalnych . Metodę tę można wdrożyć tylko w razie potrzeby.
Metody opcjonalne zaznaczasz za pomocą dyrektywy @optional
.
@protocol NewProtocol
- (void)protocolMethod:(id)argument;
@optional
- (id)anotherMethod;
@end
W takim przypadku tylko anotherMethod
jest oznaczona jako opcjonalna; zakłada się, że metody bez dyrektywy @optional
są wymagane.
Dyrektywa @optional
ma zastosowanie do następujących metod, aż do końca definicji protokołu lub do momentu znalezienia innej dyrektywy.
@protocol NewProtocol
- (void)protocolMethod:(id)argument;
@optional
- (id)anotherMethod;
- (void)andAnotherMethod:(id)argument;
@required
- (void)lastProtocolMethod;
@end
Ten ostatni przykład definiuje protokół z dwiema opcjonalnymi metodami i dwiema wymaganymi metodami.
Zgodny z protokołami
Poniższa składnia wskazuje, że klasa przyjmuje protokół za pomocą nawiasów kątowych.
@interface NewClass : NSObject <NewProtocol>
...
@end
Oznacza to, że każde wystąpienie NewClass zareaguje na metody zadeklarowane w jego interfejsie, ale także zapewni implementację wszystkich wymaganych metod NewProtocol
.
Możliwe jest również, aby klasa była zgodna z wieloma protokołami, oddzielając je przecinkami.
@interface NewClass : NSObject <NewProtocol, AnotherProtocol, MyProtocol>
...
@end
Podobnie jak w przypadku zgodności z jednym protokołem, klasa musi zaimplementować każdą wymaganą metodę każdego protokołu i każdą opcjonalną metodę, którą wybierzesz.
Przekazywanie deklaracji
Możliwe jest zadeklarowanie nazwy protokołu bez metod:
@protocol Person;
użyj go swój kod (definicja klasy itp.):
@interface World : NSObject
@property (strong, nonatomic) NSArray<id<some>> *employees;
@end
a później zdefiniuj metodę protokołu gdzieś w kodzie:
@protocol Person
- (NSString *)gender;
- (NSString *)name;
@end
Jest to przydatne, gdy nie musisz znać szczegółów protokołów, dopóki nie zaimportujesz tego pliku z definicją protokołu. Tak więc plik nagłówka klasy pozostaje czysty i zawiera tylko szczegóły dotyczące klasy.
Sprawdzanie istnienia opcjonalnych implementacji metod
if ([object respondsToSelector:@selector(someOptionalMethodInProtocol:)])
{
[object someOptionalMethodInProtocol:argument];
}
Sprawdź zgodność protokołu
Zwraca wartość logiczną wskazującą, czy klasa jest zgodna z protokołem:
[MyClass conformsToProtocol:@protocol(MyProtocol)
];