2011-02-15 8 views
56

Chciałbym użyć składni @property, aby zadeklarować zsyntetyzowaną właściwość, która jest publicznie dostępna tylko do odczytu, ale ma ustawcę, który może być wywołany prywatnie z klasy.Właściwość Objective-C, która jest tylko do odczytu publicznego, ale ma prywatnego setera

Ponieważ jest to Objective-C, oznacza to, że metoda setFoo: zostanie zsyntetyzowana, ale wywołanie jej poza klasą spowoduje wygenerowanie ostrzeżenia (nierozpoznany selektor). Aby wywołać ostrzeżenie, muszę zadeklarować właściwość readonly; czy istnieje jakiś sposób zmuszenia syntetyzowanego setera, który jest dostępny tylko w klasie?

Odpowiedz

87

Myślę, że to, czego szukasz, nazywa się rozszerzeniami klas. Można by zadeklarować właściwość tylko do odczytu w nagłówku:

@interface MyClass : NSObject { 
} 

@property (readonly, assign) NSInteger myInteger; 

@end 

Następnie redeclare w rozszerzeniu klasy w pliku realizacji:

@interface MyClass() 

@property (readwrite, assign) NSInteger myInteger; 

@end 


@implementation MyClass 

@end 

Więcej sprawdzeniu Apple documentation

+1

Jesteś poprawne , zobacz także http://stackoverflow.com/questions/743586/synthesizing-properties-in-categories/3251621#3251621 –

+3

Jest to świetny sposób na wykorzystanie wygody właściwości przy jednoczesnym zachowaniu koniecznej enkapsulacji. :) Uwielbiam tę możliwość. – LucasTizma

+5

Zaktualizowany odnośnik do dokumentacji: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html#//apple_ref/doc/uid/TP40011210-CH6-SW3 –

Powiązane problemy