Respuestas:
Desde la página de Apple en " Protocolos formales ":
Los métodos de protocolo opcionales se pueden marcar como opcionales utilizando la palabra clave @optional. En correspondencia con la palabra clave modal @optional, existe una palabra clave @required para denotar formalmente la semántica del comportamiento predeterminado. Puede usar @optional y @required para dividir su protocolo en secciones como mejor le parezca. Si no especifica ninguna palabra clave, el valor predeterminado es @required.
@protocol MyProtocol
- (void)requiredMethod;
@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;
@required
- (void)anotherRequiredMethod;
@end
Si un método en un protocolo está marcado como opcional, debe verificar si un objeto implementa ese método antes de intentar llamarlo.
Como ejemplo, la vista de gráfico circular podría probar el método de título de segmento como este:
NSString *thisSegmentTitle;
if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
}
El método respondsToSelector: utiliza un selector, que se refiere al identificador de un método después de la compilación. Puede proporcionar el identificador correcto utilizando la directiva @selector () y especificando el nombre del método.
Si la fuente de datos en este ejemplo implementa el método, se utiliza el título; de lo contrario, el título permanece nulo.
@protocol MyProtocol <NSObject>
Protocolos es un conjunto de reglas. Podemos crear protocolos como el siguiente ejemplo:
TestProtocols.h
@protocol TestProtocols <NSObject>
@optional
-(void)testMethodOptional;
@required // by default
-(void)testMethodRequired;
@end
Implementación:
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 la @optional
palabra clave antes de la declaración de su método para que sea opcional. ¡Simple como eso!
// myProtocol.h
@protocol myProtocol
- (void)myMandatoryMethod:(id)someArgument;
@optional
- (void)myOptionalMethod:(id)someArgument;
@end
// myClass.m
@interface myClass : someSuperClass <myProtocol>
//...
@end
Los protocolos actúan igual que las clases abstractas, por lo que la palabra clave @optional define los métodos que son opcionales para la implementación.
Entonces, en el código, someMethod1, someMethod2 y someMethod4 son métodos obligatorios (deben implementarse). someMethod3 es opcional: si no implementamos este método, el compilador no arrojará ninguna advertencia.
@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