Respostas:
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
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.
@protocol MyProtocol <NSObject>
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
Use a @optional
palavra - 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
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