2009-05-05 13 views
14

Me gustaría usar propiedades para mis variables de instancia, pero en muchos casos, solo quiero que la clase tenga acceso al setter. Tenía la esperanza de que pudiera hacer algo como esto:¿Puedo crear propiedades con un getter público y un setter privado?

foo.h:

@interface Foo { 
    NSString *bar; 
} 
@property (readonly) NSString *bar; 
@end 

Foo.m:

#import "Foo.h" 

@interface Foo() 
@property (copy) NSString *bar; 
@end 

@implementation Foo 
@synthesize bar; 
@end 

Pero esto genera una advertencia:

Foo.m:4: warning: property ‘bar’ attribute in ‘Foo’ class continuation does not match class ‘Foo’ property 

I puede ver de qué se queja, pero todavía parece una expresión útil. ¿Hay alguna otra forma de lograr esto sin escribir mis propios setters?

Respuesta

31

Su enfoque es correcto, pero la redeclaración de @property bar en la extensión de clase debe coincidir con la declaración original excepto para readwrite contra readonly. Así que esto va a funcionar:

foo.h

@interface Foo { 
    NSString *bar; 
} 
@property (copy,readonly) NSString *bar; 
@end 

Foo.m:

#import "Foo.h" 

@interface Foo() 
@property (copy,readwrite) NSString *bar; 
@end 

@implementation Foo 
@synthesize bar; 
@end 

(recordemos que el valor predeterminado es assign de propiedades, no copy).

+0

Eh, eso nunca se me ocurrió ya que 'copiar' es irrelevante para el comprador. ¡Gracias! –

3

Cuando Barry dice "el valor predeterminado es retener las propiedades", quiere decir que retienen deben especificarse como esto:

@property (retain) NSDate *endDate; 

si se dejan así:

@property NSDate *endDate; 

de asignación es asumido por el compilador

+1

Estoy bastante seguro de que él quiso decir exactamente lo que dijo, pero tienes razón: 'assignar' es el valor predeterminado, no' retener'. http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW27 –

Cuestiones relacionadas