¿Cómo crear un protocolo con métodos que son opcionales?

133

Noté métodos marcados como opcionales en varios protocolos definidos en el SDK de iPhone, como el UIActionSheetDelegateprotocolo, por ejemplo.

¿Cómo puedo definir un protocolo propio y establecer algunos de los métodos como opcionales?

jpm
fuente

Respuestas:

248

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
Matt Gallagher
fuente
44
tenga en cuenta que: La directiva '' '@optional' '' y '' '@required' '' se aplica a cualquier método que la siga.
Wayne
31

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.

Céfiro
fuente
77
Asegúrese de extender NSObject en su protocolo para usar respondsToSelector
Fracdroid
1
Correcto, como@protocol MyProtocol <NSObject>
Lawrence Kesteloot, el
Esta es una respuesta perfecta!
smoothdvd
14

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

Use la @optionalpalabra 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
e.James
fuente
6

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
usuario3540599
fuente