Jak utworzyć protokół z metodami, które są opcjonalne?


133

Zauważyłem metody oznaczone jako opcjonalne w kilku protokołach zdefiniowanych w SDK iPhone'a, takich jak UIActionSheetDelegatenp. Protokół.

Jak mogę zdefiniować własny protokół i ustawić kilka metod jako opcjonalne?

Odpowiedzi:


248

Ze strony Apple w sekcji „ Formalne protokoły ”:

Opcjonalne metody protokołu można oznaczyć jako opcjonalne przy użyciu słowa kluczowego @optional. Odpowiadając słowu kluczowemu @optional modal, istnieje słowo kluczowe @required, które formalnie oznacza semantykę zachowania domyślnego. Możesz użyć @optional i @required, aby podzielić swój protokół na sekcje według własnego uznania. Jeśli nie określisz żadnego słowa kluczowego, wartością domyślną jest @required.

@protocol MyProtocol

- (void)requiredMethod;

@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;

@required
- (void)anotherRequiredMethod;

@end

4
zwróć uwagę, że: Dyrektywa '' '@optional' '' i '' '@required' '' ma zastosowanie do wszystkich metod, które za nią idą.
Wayne,

31

Jeśli metoda w protokole jest oznaczona jako opcjonalna, przed przystąpieniem do jej wywołania należy sprawdzić, czy obiekt implementuje tę metodę.

Na przykład widok wykresu kołowego może testować metodę tytułu segmentu w następujący sposób:

NSString *thisSegmentTitle;
if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
    thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
}

Metoda respondsToSelector: używa selektora, który po kompilacji odwołuje się do identyfikatora metody. Możesz podać poprawny identyfikator, używając dyrektywy @selector () i określając nazwę metody.

Jeśli źródło danych w tym przykładzie implementuje metodę, zostanie użyty tytuł; w przeciwnym razie tytuł pozostaje zerowy.


7
Upewnij się, że rozszerzyłeś NSObject w swoim protokole, aby używać odpowiedzi respondsToSelector
Fracdroid

1
Prawo, jak@protocol MyProtocol <NSObject>
Lawrence Kesteloot

To doskonała odpowiedź!
smoothdvd

14

Protokoły to zbiór reguł. Możemy stworzyć protokoły jak na poniższym przykładzie:

TestProtocols.h

@protocol TestProtocols <NSObject>
    @optional
    -(void)testMethodOptional;

    @required  // by default
    -(void)testMethodRequired;
@end

Realizacja:

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

12

Użyj @optionalsłowa kluczowego przed deklaracją metody, aby uczynić ją opcjonalną. Proste!

// myProtocol.h
@protocol myProtocol
- (void)myMandatoryMethod:(id)someArgument;
@optional
- (void)myOptionalMethod:(id)someArgument;
@end
// myClass.m
@interface myClass : someSuperClass <myProtocol>
    //...
@end

6

Protokoły działają tak samo jak klasy abstrakcyjne, więc słowo kluczowe @optional definiuje te metody, które są opcjonalne do implementacji.

Tak więc w kodzie niektóreMethod1, someMethod2 i someMethod4 są metodami wymaganymi (muszą być zaimplementowane). someMethod3 jest opcjonalna - jeśli nie zaimplementowaliśmy tej metody, kompilator nie będzie generował żadnych ostrzeżeń.

@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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.