2011-01-08 20 views
6

Quiero extender o agregar otro método a un protocolo existente. Aunque el protocolo en particular no es importante, esto es lo que estoy tratando de hacer.¿Cómo agregar un método a un protocolo existente en Cocoa?

@protocol NSMatrixDelegate 
- (void)myNewMethod:(id)sender; 
@end 

El compilador advierte que tengo una declaración duplicada del mismo protocolo. ¿Cómo haría esto correctamente?

Gracias.

Respuesta

12

No se pueden definir categorías para protocolos. Hay 2 maneras de evitar esto:

  • uso de un nuevo protocolo formal
  • utilizar un protocolo y el tiempo de ejecución informal comprobar

protocolo formal

Definir un nuevo protocolo formal sería el siguiente:

@protocol MyCustomMatrixDelegate <NSMatrixDelegate> 

- (void) myNewMethod:(id)sender; 

@end 

Luego harías que tu clase personalizada se conforme o <MyCustomMatrixDelegate> en lugar de <NSMatrixDelegate>. Si utiliza este enfoque, hay algo que debe tener en cuenta: [self delegate] probablemente se declarará como id<NSMatrixDelegate>. Esto significa que no puede hacer [[self delegate] myNewMethod:obj], porque <NSMatrixDelegate> no declara el método myNewMethod:.

La forma de evitar esto es volver a escribir el objeto delegate mediante un casting. Tal vez algo como:

- (id<MyCustomMatrixDelegate>) customDelegate { 
    return (id<MyCustomMatrixDelegate>)[self delegate]; 
} 

(Sin embargo, es posible que desee hacer algún tipo de comprobación de primera, como:

if ([[self delegate] conformsToProtocol:@protocol(MyCustomMatrixDelegate)]) { 
    return (id<MyCustomMatrixDelegate>)[self delegate]; 
} 
return nil; 

)

Y entonces usted haría:

[[self customDelegate] myNewMethod:obj]; 

Protocolo informal

Este es realmente un nombre de fantasía para una categoría en NSObject:

@interface NSObject (MyCustomMatrixDelegate) 

- (void) myNewMethod:(id)sender; 

@end 

Entonces simplemente no implementar el método. En su clase que enviaría el método, lo haría:

if ([[self delegate] respondsToSelector:@selector(myNewMethod:)]) { 
    [[self delegate] myNewMethod:someSenderValue]; 
} 
+0

Intenté el método del protocolo formal. Funciona, sin embargo, el compilador advierte que el método personalizado no se puede encontrar en el protocolo. Agregué el protocolo formal a la interfaz del delegado e incluí el encabezado del delegado en el archivo de implementación del objeto al que estoy enviando el mensaje de delegado. ¿Tienes alguna idea de por qué todavía se queja? Gracias – David

+0

@David edited answer –

+0

Eres brillante. Funciona de maravilla. Gracias. – David

Cuestiones relacionadas