2011-02-15 11 views
56

Vorrei utilizzare la sintassi @property per dichiarare una proprietà sintetizzata che è di sola lettura pubblica ma ha un setter che può essere chiamato in privato all'interno della classe.Proprietà Objective-C che è di sola lettura pubblicamente, ma ha un setter privato

Poiché si tratta di Objective-C, ciò significa che il metodo setFoo: verrà sintetizzato, ma se viene chiamato al di fuori della classe stessa, verrà generato un avviso (selettore non riconosciuto). Per attivare l'avviso devo dichiarare la proprietà readonly; c'è un modo per forzare un setter sintetizzato che è disponibile solo all'interno della classe?

risposta

87

Penso che quello che stai cercando si chiami estensioni di classe. Si potrebbe dichiarare la proprietà di sola lettura nell'intestazione:

@interface MyClass : NSObject { 
} 

@property (readonly, assign) NSInteger myInteger; 

@end 

Poi ridichiarare nell'estensione della classe nel file di implementazione:

@interface MyClass() 

@property (readwrite, assign) NSInteger myInteger; 

@end 


@implementation MyClass 

@end 

Per ulteriori controllare di Apple documentation

+1

Sei corretta , vedi anche http://stackoverflow.com/questions/743586/synthesizing-properties-in-categories/3251621#3251621 –

+3

Questo è un ottimo modo per sfruttare la convenienza delle proprietà pur mantenendo l'incapsulamento necessario. :) Adoro questa capacità. – LucasTizma

+5

Aggiornato Link documentazione: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html#//apple_ref/doc/uid/TP40011210-CH6-SW3 –

Problemi correlati