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) ];



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow