Estoy atascado con las propiedades de Object-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 debe tener getMethod
. No sé cómo hacerlo. las respuestas con algunos fragmentos de código son apreciadas.Escribir solo propiedad en Objective-C
Respuesta
Usted puede hacer algo como:
@interface MyClass {
@private
int _var;
}
- (void)setVar:(int)newVar;
@end
@implementation MyClass
- (void)setVar:(int)newVar {
_var = newVar;
}
@end
Ahora se puede acceder a la variable var
como una propiedad que es de sólo escritura:
@implementation SomeOtherClass
...
MyClass c = [[MyClass alloc] init];
c.var = 3;
...
@end
Y si se intenta leer la propiedad falsificar la el compilador te advertirá.
Necesita definir un método '- (void) setVar: (int) newVar' en la implementación, así como en la interfaz. – JeremyP
Tenga en cuenta que esto no oculta por completo el valor. A menos que anule (BOOL) accessInstanceVariablesDirectly con NO, puede obtener el valor con valueForKey: @ "var". E incluso si anula esto, aún puede obtener el valor con un método objC-runtime como object_getInstanceVariable. –
no es una propiedad – kubbing
¿Hay alguna razón para que esto tenga que ser una propiedad? Simplemente declararía el setter como método y usaría la sintaxis normal [foo setVar:bar]
.
O use la sintaxis de puntos ... 'foo.var = bar;' seguirá funcionando. – bbum
Sí, eso funciona, pero xCode no parece autocompletar var cuando escribe. –
@FredrikJohansson tienes razón. Para una solución amigable de autocompletar, es posible que desee verificar mi solución. –
Otro enfoque válido es declarar la propiedad normal y hacer que el comprador no está disponible
@interface MyClass
@property NSString * var;
- (NSString *)var UNAVAILABLE_ATTRIBUTE;
@end
Esto elevará un error en tiempo de compilación en caso de que alguien trata de acceder al comprador.
La principal ventaja de este enfoque es que en realidad tiene un bienes inmuebles TM y no un sustituto falsificado por una variable de instancia y un organismo, lo que implica que:
- se Obtendrá la autocompletación cuando use notación de puntos en Xcode
- todas las funciones de tiempo de ejecución como
class_getProperty
yclass_copyPropertyList
funcionarán como se esperaba.
Dicho esto, la aplicación captador se sintetiza de todos modos y se puede invocar usando algo como
NSString * string = [myObj performSelector:@selector(var)];
o el uso de NSInvocation
(en caso de una propiedad no id
)
Si está paranoico y usted Realmente desea evitar que el cliente invoque el captador, puede lanzar una excepción explícitamente al proporcionar su propia implementación.
@implementation MyClass
- (int)var {
[NSException raise:NSInternalInconsistencyException
format:@"property is write-only"];
}
@end
De todos modos, si alguien quiere seriamente modificar el comportamiento variable de instancia, pueden utilizar el tiempo de ejecución para acceder a ella, por lo que la última precaución es probablemente inútil dado el caso de uso. Un error en tiempo de compilación es lo que realmente está buscando.
- 1. Anular propiedad de solo lectura para leer/escribir propiedad
- 2. Bloques ObjectiveC equivalente en Java
- 3. propiedad automática de VB.net - ¿solo?
- 4. Hacer una propiedad de solo lectura que se pueda escribir en la clase derivada
- 5. objectivec: fb publicar comentario error
- 6. ObjectiveC Parse Integer from String
- 7. ¿Cómo implementar un puente sin cargo en ObjectiveC/C?
- 8. propiedad de solo lectura en campo SenchaTouch
- 9. devolver solo una propiedad "_id"
- 10. ¿Por qué una propiedad de solo lectura todavía permite escribir con KVC
- 11. ¿Puedo colocar un ObjectiveC @selector en un NSDictionary?
- 12. ¿Puede 'iterator' escribir solo la subclase 'const_iterator'?
- 13. Cómo implementar una propiedad de solo lectura
- 14. Inicializando una propiedad de solo lectura
- 15. Uso de librerías estáticas C/C++ desde iPhone Aplicaciones ObjectiveC
- 16. enviar una notificación desde javascript en UIWebView a ObjectiveC
- 17. Cómo dividir la nueva línea de NSString en ObjectiveC
- 18. obteniendo el error "invalid_client" en la muestra gdata-objectivec-client
- 19. Pros y contras del uso de excepción en IOS/ObjectiveC
- 20. Forzar serialización XML para serializar la propiedad de solo lectura
- 21. ¿Cómo escribir en un solo archivo con múltiples hilos?
- 22. Propiedad de solo lectura PropertyGrid en el nivel de objeto
- 23. Buscar solo obtener o establecer referencias de propiedad en VS2010?
- 24. ¿Cómo correlacionar una propiedad solo para HQL (en Hibernate)?
- 25. Usando JSON.Net para escribir un nombre de propiedad
- 26. Obtener nombre de propiedad y escribir con expresión lambda
- 27. Diferencia entre NSLog y sentencia printf para ObjectiveC
- 28. ObjectiveC: ¿dónde declarar las propiedades de instancias privadas?
- 29. Ayuda con código GCC y ObjectiveC y Cygwin
- 30. ObjectiveC que pasa alrededor ... nula terminado listas de argumentos
¿De qué sirve la propiedad de solo escritura? En mi humilde opinión, es solo un desperdicio de memoria. – Eimantas
Muchos de los usos; por lo general, cuando desea que algo sea públicamente de solo escritura e internamente a la clase es readwrite. – bbum
Cuando una clase externa conoce una variable que se debe pasar, pero no tiene ninguna razón para saber en qué está configurado actualmente. – ArtOfWarfare