Como criar um protocolo com métodos opcionais?

133

Notei métodos marcados como opcionais em vários protocolos definidos no SDK do iPhone, como o UIActionSheetDelegateprotocolo, por exemplo.

Como posso definir um protocolo próprio e definir alguns dos métodos como opcionais?

jpm
fonte

Respostas:

248

Na página da Apple em " Protocolos formais ":

Os métodos de protocolo opcionais podem ser marcados como opcionais usando a palavra-chave @optional. Correspondendo à palavra-chave modal opcional, existe uma palavra-chave @required para denotar formalmente a semântica do comportamento padrão. Você pode usar @optional e @required para particionar seu protocolo em seções como achar melhor. Se você não especificar nenhuma palavra-chave, o padrão será @required.

@protocol MyProtocol

- (void)requiredMethod;

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

@required
- (void)anotherRequiredMethod;

@end
Matt Gallagher
fonte
4
observe que: A diretiva '' '@optional' '' e '' '@required' '' se aplica a todos os métodos que a seguem.
7117 Wayne
31

Se um método em um protocolo estiver marcado como opcional, você deverá verificar se um objeto implementa esse método antes de tentar chamá-lo.

Como exemplo, a visualização do gráfico de setores circulares pode testar o método de título do segmento como este:

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

O método respondsToSelector: usa um seletor, que se refere ao identificador de um método após a compilação. Você pode fornecer o identificador correto usando a diretiva @selector () e especificando o nome do método.

Se a fonte de dados neste exemplo implementar o método, o título será usado; caso contrário, o título permanecerá nulo.

Zephyr
fonte
7
Certifique-se de estender NSObject no seu protocolo usar respondsToSelector
Fracdroid
1
Certo, como@protocol MyProtocol <NSObject>
Lawrence Kesteloot 6/11
Esta é uma resposta perfeita!
Smoothdvd
14

Protocolos é um conjunto de regras. Podemos criar protocolos como exemplo abaixo:

TestProtocols.h

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

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

Implementação:

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
Vikram Biwal
fonte
12

Use a @optionalpalavra - chave antes da declaração do método para torná-la opcional. Simples assim!

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

Os protocolos agem da mesma forma que as classes abstratas; portanto, a palavra-chave @optional define os métodos que são opcionais para implementação.

Portanto, no código, someMethod1, someMethod2 e someMethod4 são métodos obrigatórios (devem ser implementados). someMethod3 é opcional - se não implementarmos esse método, o compilador não emitirá nenhum aviso.

@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
fonte