Как создать протокол с дополнительными методами?

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

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

4b9b3361

На странице Apple на странице Официальные протоколы:

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

@protocol MyProtocol

- (void)requiredMethod;

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

@required
- (void)anotherRequiredMethod;

@end
222
ответ дан 27 нояб. '08 в 2:21
источник

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

В качестве примера в виде круговой диаграммы можно проверить метод заголовка сегмента следующим образом:

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

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

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

22
ответ дан 03 сент. '14 в 17:52
источник

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

// myProtocol.h
@protocol myProtocol
- (void)myMandatoryMethod:(id)someArgument;
@optional
- (void)myOptionalMethod:(id)someArgument;
@end
// myClass.m
@interface myClass : someSuperClass <myProtocol>
    //...
@end
10
ответ дан 27 нояб. '08 в 2:21
источник

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

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
8
ответ дан 28 мая '15 в 16:36
источник

Протоколы действуют так же, как абстрактные классы, поэтому ключевое слово @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
3
ответ дан 07 мая '14 в 10:26
источник