2011-02-15 1773 views
56

Me gustaría usar la sintaxis @property para declarar una propiedad sintetizada que es públicamente de solo lectura pero tiene un setter que se puede llamar de manera privada desde la clase.Propiedad Objective-C que es de solo lectura pública, pero tiene un setter privado

Dado que se trata de Objective-C, esto significa básicamente que se sintetizará el método setFoo:, pero llamarlo fuera de la clase en sí generaría una advertencia (selector no reconocido). Para activar la advertencia, debo declarar la propiedad readonly; ¿Hay alguna forma de forzar un setter sintetizado que solo esté disponible dentro de la clase?

Respuesta

87

Creo que lo que estás buscando se llaman extensiones de clase. Se podría declarar la propiedad de sólo lectura en la cabecera:

@interface MyClass : NSObject { 
} 

@property (readonly, assign) NSInteger myInteger; 

@end 

Entonces redeclare en su extensión de clase en el archivo de implementación:

@interface MyClass() 

@property (readwrite, assign) NSInteger myInteger; 

@end 


@implementation MyClass 

@end 

Para más visita de Apple documentation

+1

Usted es correcta , consulte también http://stackoverflow.com/questions/743586/synthesizing-properties-in-categories/3251621#3251621 –

+3

Esta es una excelente forma de aprovechar la comodidad de las propiedades mientras mantiene la encapsulación necesaria. :) Me encanta esta capacidad. – LucasTizma

+5

Enlace de documentación actualizado: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html#//apple_ref/doc/uid/TP40011210-CH6-SW3 –

Cuestiones relacionadas