A partire da Xcode 8, puoi definire le proprietà della classe in Obj-C. Questo è stato aggiunto per interagire con le proprietà statiche di Swift.
Objective-C ora supporta le proprietà di classe, che interagiscono con le proprietà del tipo Swift. Sono dichiarati come: @property (class) NSString * someStringProperty ;. Non sono mai sintetizzati. (23891898)
Ecco un esempio
@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
Quindi puoi accedervi in questo modo:
YourClass.currentId = 1;
val = YourClass.currentId;
Ecco un post esplicativo molto interessante che ho usato come riferimento per modificare questa vecchia risposta.
Risposta 2011: (non usare questo, è terribile)
Se davvero non vuoi dichiarare una variabile globale, c'è un'altra opzione, forse non molto ortodossa :-), ma funziona ... Puoi dichiarare un metodo "get & set" come questo, con una variabile statica all'interno:
+ (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;
}
Quindi, se hai bisogno di ottenere il valore, chiama:
NSString *testVal = [MyClass testHolder:nil]
E poi, quando vuoi impostarlo:
[MyClass testHolder:testVal]
Nel caso in cui tu voglia essere in grado di impostare questo pseudo-static-var su zero, puoi dichiarare testHolder
come questo:
+ (NSString*)testHolderSet:(BOOL)shouldSet newValue:(NSString*)_test {
static NSString *test;
if(shouldSet) {
if(test != nil)
[test release];
test = [_test retain];
}
return test;
}
E due metodi utili:
+ (NSString*)test {
return [MyClass testHolderSet:NO newValue:nil];
}
+ (void)setTest:(NSString*)_test {
[MyClass testHolderSet:YES newValue:_test];
}
Spero che sia d'aiuto! In bocca al lupo.