2009-05-05 15 views
14

Vorrei utilizzare le proprietà per le variabili di istanza, ma in molti casi, desidero solo che la classe abbia accesso al setter. Speravo di poter fare qualcosa di simile:Posso creare proprietà con un getter pubblico e un setter privato?

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 

Ma questo genera un avviso:

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

I può vedere di cosa si lamenta, ma sembra ancora un utile idioma. C'è un altro modo per farlo senza scrivere i miei setter?

risposta

31

L'approccio è corretto, ma la rediregazione di @property bar nell'estensione di classe deve corrispondere alla dichiarazione originale ad eccezione di readwrite vs. readonly. Quindi questo lavoro:

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 

(ricordiamo che il valore predefinito è assign per le proprietà, non copy).

+0

Huh, che non mi è mai venuto in mente poiché "copia" è altrimenti irrilevante per il getter. Grazie! –

3

Quando Barry dice "il valore predefinito è conservare per le proprietà" egli intende che mantengono dovrebbe essere specificate in questo modo:

@property (retain) NSDate *endDate; 

se sono lasciati in questo modo:

@property NSDate *endDate; 

assegnazione si assume il compilatore.

+1

Sono quasi sicuro che intendesse esattamente quello che ha detto, ma hai ragione: "l'assegnazione" è l'impostazione predefinita, non "conserva". http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW27 –

Problemi correlati