Как создать протокол с методами, которые являются необязательными? - PullRequest
127 голосов
/ 27 ноября 2008

Я заметил, что методы помечены как необязательные в нескольких протоколах, определенных в iPhone SDK, например, в протоколе UIActionSheetDelegate.

Как я могу определить свой собственный протокол и установить несколько методов как необязательные?

Ответы [ 5 ]

238 голосов
/ 27 ноября 2008

Со страницы Apple на « Формальные протоколы »:

Факультативный протокол методы могут быть помечены как дополнительные используя ключевое слово @optional. Соответствует @opional модал ключевое слово, есть ключевое слово @required формально обозначить семантику поведение по умолчанию. Ты можешь использовать @option и @required для разделения ваш протокол на разделы, как вы видите поместиться. Если вы не укажете ключевое слово, по умолчанию @ обязательный.

@protocol MyProtocol

- (void)requiredMethod;

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

@required
- (void)anotherRequiredMethod;

@end
29 голосов
/ 03 сентября 2014

Если метод в протоколе помечен как необязательный, вы должны проверить, реализует ли объект этот метод, прежде чем пытаться вызвать его.

Например, представление круговой диаграммы может проверить метод заголовка сегмента, например:

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

RespondsToSelector: метод использует селектор, который ссылается на идентификатор метода после компиляции. Вы можете предоставить правильный идентификатор, используя директиву @selector () и указав имя метода.

Если источник данных в этом примере реализует метод, используется заголовок; в противном случае заголовок остается нулевым.

12 голосов
/ 28 мая 2015

Протоколы это набор правил. Мы можем создать протоколы, как показано ниже:

TestProtocols.h

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

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

Реализация:

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
11 голосов
/ 27 ноября 2008

Используйте ключевое слово @optional перед объявлением метода, чтобы сделать его необязательным. Все просто!

// myProtocol.h
@protocol myProtocol
- (void)myMandatoryMethod:(id)someArgument;
@optional
- (void)myOptionalMethod:(id)someArgument;
@end
// myClass.m
@interface myClass : someSuperClass <myProtocol>
    //...
@end
4 голосов
/ 07 мая 2014

Протоколы действуют так же, как абстрактные классы, поэтому ключевое слово @optional определяет те методы, которые являются необязательными для реализации.

Итак, в коде someMethod1, someMethod2 и someMethod4 являются обязательными методами (должны быть реализованы). someMethod3 является необязательным - если мы не реализовали этот метод, компилятор не будет выдавать никаких предупреждений.

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...