2008-11-26 10 views

Respuesta

226

Desde la página de Apple en "Formal Protocols":

opcionales Protocolo métodos pueden ser marcados como opcional usando la palabra clave @optional. Correspondiente a la palabra clave @optional modal , hay una palabra clave @required para indicar formalmente la semántica de el comportamiento predeterminado. Puede usar @optional y @required para particionar su protocolo en secciones, como puede ver en fit. Si no especifica ninguna palabra clave , el valor predeterminado es @required.

@protocol MyProtocol 

- (void)requiredMethod; 

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

@required 
- (void)anotherRequiredMethod; 

@end 
+1

en cuenta que: La directiva '' '' '' @optional y '' '@Required' '' se aplica a cualquier método que le siguen. – Wayne

11

Utilice la palabra clave @optional antes de su declaración de 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
3

Protocolos actúan igual que las clases abstractas, por lo que la palabra clave @optional define los métodos que son opcionales para su implementación.

Por lo tanto, en el código, algunosMétodo1, algunosMétodo2 y algunosMétodo4 son métodos obligatorios (deben implementarse). someMethod3 es opcional: si no implementamos este método, el compilador no lanzará 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 
23

Si un método de un protocolo se marca como opcional, debe comprobar si un objeto implementa este método antes de intentar llamarlo.

Como un ejemplo, la vista de gráfico circular puede probar para el método título segmento como esto:

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

El respondsToSelector: método utiliza un selector, que hace referencia 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 usa el título; de lo contrario, el título permanece nulo.

+5

Asegúrese de extender NSObject en su protocolo para usar respondsToSelector – Fracdroid

8

Protocolos es un conjunto de reglas. Podemos crear protocolos de la 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 
Cuestiones relacionadas