2009-08-27 10 views
19

Czy istnieje sposób na utworzenie właściwości takiej jak ta właściwość C# w Objective-C?Co to jest odpowiednik Objective-C publicznej właściwości get/protected set w C#

public int prop { get; protected set;} 

Zasadniczo, chcę, aby to możliwe, aby uzyskać wartość spoza klasy, ale tylko być w stanie ustawić wartość od wewnątrz klasy.

+1

W rzeczywistości chroniona ma specjalne znaczenie, co oznacza, że ​​klasy pochodne będą miały dostęp. –

+0

Zabezpieczone lub prywatne będą działać dla mnie. :-) –

Odpowiedz

24

Najprostszym sposobem osiągnięcia tego celu jest zadeklarować właściwość jako readonly w interfejsie publicznym dla MyClass (czyli pliku .h):

@property (readonly) NSInteger prop; 

Następnie w pliku .m dla tej klasy, zadeklarować klasa extension (kategoria z pustą nazwą). W rozszerzeniach klasowych, można redeclare @property zmienić swoje writeability do ReadWrite:

@interface MyClass() 
@property (readwrite) NSInteger prop; 
@end 

@implementation MyClass 
@synthesize prop; 
... 
@end 

Oczywiście, Objective-C nie narzuca ograniczeń dostępu, więc nic nie zatrzymując się jakieś fałszywe kod z wywołaniem -[MyClass setProp:]. Kompilator zaznaczy to jako ostrzeżenie, które jest tak dobre, jak można uzyskać w Objective-C. Niestety, nie ma standardowego sposobu udokumentowania tej "chronionej" właściwości zapisu dla podklas; będziesz musiał załatwić konwencję dla swojego zespołu i/lub umieścić ją w publicznej dokumentacji dla klasy, jeśli jest w ramach, który zamierzasz wydać.

+0

Czy domyślny? Readwrite? Czy konieczne jest określenie tego? –

+0

@RaffiKhatchadourian, 'readwrite' jest wartością domyślną, ale w rozszerzeniu klasy, które przesłania deklarację oryginalną' readonly', konieczne jest 'readwrite'. –

+0

@BarryWark - mylisz się co do tego. Spróbuj i zobacz. Ponieważ 'readwrite' jest wartością domyślną, redeclarowanie właściwości powoduje, że jest ona domyślnie nazywana' readwrite'. To właśnie oznacza bycie domyślnym. :) – matt

1

wierzę szukasz atrybutem tylko do odczytu na @property

@property (readonly) NSInteger prop; 

Czytaj więcej here.

+0

Ale czy to nie wymaga ode mnie dostępu do wartości za nią bezpośrednio, a nie korzystania z nieruchomości? –

+0

tak, jeśli chcesz ustawić wartość tylko wewnątrz klasy, to tak naprawdę nie musisz używać składni self.prop ... wystarczy bezpośrednio odwołać się do podpory. Atrybut readonly gwarantuje, że wszystko poza Twoją klasą może uzyskać tylko wartość, ale nigdy jej nie ustawiaj. – keno

+0

To jest niekompletna odpowiedź; możesz redeclare właściwość w rozszerzeniu klasy, aby go odczytać. –

1

Nie ma sposobu na utworzenie metod @ private/@ protected w ObjC, te instrukcje do kompilatora dotyczą tylko zmiennych instancji. Można jednak zadeklarować statyczną funkcję C w tym samym pliku, aby uzyskać metodę "@private".

Odpowiedź Keno wydaje się być najodpowiedniejszym sposobem osiągnięcia tego.

Powiązane problemy