Depuis Xcode 8, vous pouvez définir les propriétés de classe dans Obj-C. Cela a été ajouté pour interagir avec les propriétés statiques de Swift.
Objective-C prend désormais en charge les propriétés de classe, qui interagissent avec les propriétés de type Swift. Ils sont déclarés comme: @property (class) NSString * someStringProperty ;. Ils ne sont jamais synthétisés. (23891898)
Voici un exemple
@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
Ensuite, vous pouvez y accéder comme ceci:
YourClass.currentId = 1;
val = YourClass.currentId;
Voici un article explicatif très intéressant que j'ai utilisé comme référence pour éditer cette ancienne réponse.
Réponse de 2011: (ne l'utilisez pas, c'est terrible)
Si vous ne voulez vraiment pas déclarer une variable globale, il existe une autre option, peut-être pas très orthodoxe :-), mais qui fonctionne ... Vous pouvez déclarer une méthode "get & set" comme celle-ci, avec une variable statique à l'intérieur:
+ (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;
}
Donc, si vous avez besoin d'obtenir la valeur, appelez simplement:
NSString *testVal = [MyClass testHolder:nil]
Et puis, lorsque vous souhaitez le paramétrer:
[MyClass testHolder:testVal]
Dans le cas où vous voulez pouvoir définir cette pseudo-statique-var à nil, vous pouvez déclarer testHolder
comme ceci:
+ (NSString*)testHolderSet:(BOOL)shouldSet newValue:(NSString*)_test {
static NSString *test;
if(shouldSet) {
if(test != nil)
[test release];
test = [_test retain];
}
return test;
}
Et deux méthodes pratiques:
+ (NSString*)test {
return [MyClass testHolderSet:NO newValue:nil];
}
+ (void)setTest:(NSString*)_test {
[MyClass testHolderSet:YES newValue:_test];
}
J'espère que ça aide! Bonne chance.