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

133

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

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

JPM
источник

Ответы:

248

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

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

@protocol MyProtocol

- (void)requiredMethod;

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

@required
- (void)anotherRequiredMethod;

@end
Мэтт Галлахер
источник
4
обратите внимание, что: директива '' '@optional' '' и '' '@required' '' применяется к любым методам, которые следуют за ней.
Уэйн
31

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

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

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

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

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

зефир
источник
7
Не забудьте расширить NSObject в своем протоколе, чтобы использовать
RespondsToSelector
1
@protocol MyProtocol <NSObject>
Хорошо
Это идеальный ответ!
smoothdvd
14

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

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
Викрам Бивал
источник
12

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

// myProtocol.h
@protocol myProtocol
- (void)myMandatoryMethod:(id)someArgument;
@optional
- (void)myOptionalMethod:(id)someArgument;
@end
// myClass.m
@interface myClass : someSuperClass <myProtocol>
    //...
@end
e.James
источник
6

Протоколы действуют так же, как абстрактные классы, поэтому ключевое слово @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
user3540599
источник