Począwszy od Xcode 8, można zdefiniować właściwości klasy w Obj-C. Zostało to dodane, aby współdziałać ze statycznymi właściwościami Swift.
Objective-C obsługuje teraz właściwości klas, które współdziałają z właściwościami typu Swift. Są one deklarowane jako: @property (class) NSString * someStringProperty ;. Nigdy nie są syntetyzowane. (23891898)
Oto przykład
@interface YourClass : NSObject
@property (class, nonatomic, assign) NSInteger currentId;
@end
@implementation YourClass
static NSInteger _currentId = 0;
+ (NSInteger)currentId {
return _currentId;
}
+ (void)setCurrentId:(NSInteger)newValue {
_currentId = newValue;
}
@end
Następnie możesz uzyskać do niego dostęp w następujący sposób:
YourClass.currentId = 1;
val = YourClass.currentId;
Oto bardzo interesujący post wyjaśniający, którego użyłem jako odniesienia do edycji tej starej odpowiedzi.
Odpowiedź z 2011 roku: (nie używaj tego, to straszne)
Jeśli naprawdę nie chcesz deklarować zmiennej globalnej, istnieje inna opcja, może niezbyt ortodoksyjna :-), ale działa ... Możesz zadeklarować metodę "get & set" w ten sposób, ze zmienną statyczną w środku:
+ (NSString*)testHolder:(NSString*)_test {
static NSString *test;
if(_test != nil) {
if(test != nil)
[test release];
test = [_test retain];
}
// if(test == nil)
// test = @"Initialize the var here if you need to";
return test;
}
Więc jeśli chcesz uzyskać wartość, po prostu zadzwoń:
NSString *testVal = [MyClass testHolder:nil]
A potem, kiedy chcesz to ustawić:
[MyClass testHolder:testVal]
W przypadku, gdy chcesz mieć możliwość ustawienia tej pseudo-statycznej-zmiennej na nil, możesz zadeklarować testHolder
następująco:
+ (NSString*)testHolderSet:(BOOL)shouldSet newValue:(NSString*)_test {
static NSString *test;
if(shouldSet) {
if(test != nil)
[test release];
test = [_test retain];
}
return test;
}
Oraz dwie przydatne metody:
+ (NSString*)test {
return [MyClass testHolderSet:NO newValue:nil];
}
+ (void)setTest:(NSString*)_test {
[MyClass testHolderSet:YES newValue:_test];
}
Mam nadzieję, że to pomoże! Powodzenia.