iphone - tutorial - xcode doc




Como criar um protocolo com métodos opcionais? (4)

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

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


Da página da Apple em " Protocolos Formais ":

Os métodos opcionais do protocolo podem ser marcados como opcionais usando a palavra-chave @optional. Correspondendo à palavra-chave modal @optional, há 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

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.

Então, no código, someMethod1, someMethod2 e someMethod4 são métodos obrigatórios (devem ser implementados). someMethod3 é opcional - se não implementarmos este método, o compilador não lançará 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

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

Por exemplo, a visualização de gráfico de pizza pode testar o método de título de segmento da seguinte forma:

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 permanece nulo.


Use a palavra-chave @optional 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




objective-c