objective iphone objective-c iphone-sdk-3.0 properties accessor

iphone - Escribe solo propiedad en Objective-C



uiimageview swift 4 (3)

Estoy atascado con propiedades objetivas-c. Lo que necesito es asignar una propiedad de solo escritura para una variable, exactamente lo opuesto a readonly, es decir, la variable puede tener setMethod , pero no debería tener getMethod . No se como hacerlo Se agradecen las respuestas con algunos fragmentos de código.


¿Hay alguna razón para que esto sea una propiedad? Acabo de declarar el configurador como un método y uso la sintaxis normal [foo setVar:bar] .


Otro enfoque válido es declarar la propiedad normal y hacer que el captador no esté disponible.

@interface MyClass @property NSString * var; - (NSString *)var UNAVAILABLE_ATTRIBUTE; @end

Esto generará un error en tiempo de compilación en caso de que alguien intente acceder al getter.

La principal ventaja de este enfoque es que realmente tiene una propiedad real TM y no un sustituto falsificado por una variable de instancia y un configurador, lo que implica que:

  • obtendrá autocompletado cuando use la notación de puntos en Xcode
  • Todas las funciones de tiempo de ejecución como class_getProperty y class_copyPropertyList funcionarán como se espera.

Dicho esto, la implementación getter se sintetiza de todos modos y podría invocarse usando algo como

NSString * string = [myObj performSelector:@selector(var)];

o usando NSInvocation (en el caso de una propiedad que no sea id )

Si está paranoico y realmente desea evitar que el cliente invoque al captador, puede lanzar explícitamente una excepción al proporcionar su propia implementación.

@implementation MyClass - (int)var { [NSException raise:NSInternalInconsistencyException format:@"property is write-only"]; } @end

De todos modos, si alguien realmente quiere alterar su variable de instancia, puede usar el tiempo de ejecución para acceder a ella, por lo que la última precaución probablemente sea inútil dado el caso de uso. Un error en tiempo de compilación es lo que realmente estás buscando.


Puedes hacer algo como:

@interface MyClass { @private int _var; } - (void)setVar:(int)newVar; @end @implementation MyClass - (void)setVar:(int)newVar { _var = newVar; } @end

Ahora puede acceder a la variable var como una propiedad que es de solo escritura:

@implementation SomeOtherClass ... MyClass c = [[MyClass alloc] init]; c.var = 3; ... @end

Y si intentas leer la propiedad falsa, el compilador te avisará.