que he visto el uso de protocolos de Objective-C se acostumbre de una manera tal como la siguiente:¿Cómo manejar los protocolos de Objective-C que contienen propiedades?
@protocol MyProtocol <NSObject>
@required
@property (readonly) NSString *title;
@optional
- (void) someMethod;
@end
que he visto este formato que se utiliza en lugar de escribir una superclase concreto que se extienden subclases. La pregunta es, si se ajusta a este protocolo, ¿necesita sintetizar las propiedades usted mismo? Si extiende una superclase, la respuesta es obviamente no, no es necesario. Pero, ¿cómo se manejan las propiedades que un protocolo requiere para cumplir?
A mi entender, aún necesita declarar las variables de instancia en el archivo de encabezado de un objeto que cumpla con un protocolo que requiera estas propiedades. En ese caso, ¿podemos suponer que solo son un principio rector? Por cierto, no es el mismo caso para un método requerido. El compilador golpeará su muñeca para excluir un método requerido que enumera un protocolo. ¿Cuál es la historia detrás de las propiedades?
Aquí hay un ejemplo que genera un error de compilación (Nota: He recortado el código que no refleja sobre el problema en cuestión):
MyProtocol.h
@protocol MyProtocol <NSObject>
@required
@property (nonatomic, retain) id anObject;
@optional
TestProtocolsViewController.h
- (void)iDoCoolStuff;
@end
#import <MyProtocol.h>
@interface TestProtocolsViewController : UIViewController <MyProtocol> {
}
@end
TestProtocolsViewController.m
#import "TestProtocolsViewController.h"
@implementation TestProtocolsViewController
@synthesize anObject; // anObject doesn't exist, even though we conform to MyProtocol.
- (void)dealloc {
[anObject release]; //anObject doesn't exist, even though we conform to MyProtocol.
[super dealloc];
}
@end
Para propiedades definidas en un protocolo, aún necesita un "@synthesize" incluso en el tiempo de ejecución moderno, o necesita duplicar la "propiedad @" en la definición de su interfaz para obtener la auto-síntesis. –
@JeffreyHarris ¿Qué hay de igual en Swift? –
@KaranAlangat: no existe tal cosa como \ @synthesize en Swift, pero al igual que ObjC, es necesario declarar la propiedad en una clase que dice cumplir con el protocolo. En Swift puede crear una categoría que defina una implementación predeterminada de una función, pero por lo que he podido decir, no puede tener una propiedad predeterminada para un protocolo. –