Як створити протокол методами, які не є обов'язковими?


133

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

Як я можу визначити власний протокол і встановити кілька методів як необов'язкові?

Відповіді:


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

Метод respondsToSelector: використовує селектор, який посилається на ідентифікатор методу після компіляції. Ви можете надати правильний ідентифікатор, скориставшись директивою @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

6

Протоколи діють так само, як абстрактні класи, тому ключове слово @optional визначає ті методи, які необов’язкові для реалізації.

Отже, у коді деякі методи1, деякіМетод2 та деякіМетод4 необхідні методи (повинні бути реалізовані). 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.