Начиная с Xcode 8, вы можете определить свойства класса в Obj-C. Это было добавлено для взаимодействия со статическими свойствами Swift.
Objective-C теперь поддерживает свойства класса, которые взаимодействуют со свойствами типа Swift. Они объявлены как: @property (class) NSString * someStringProperty ;. Они никогда не синтезируются. (23891898)
Вот пример
@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
Тогда вы можете получить к нему доступ так:
YourClass.currentId = 1;
val = YourClass.currentId;
Вот очень интересный пояснительный пост, который я использовал как ссылку для редактирования этого старого ответа.
2011 Ответ: (не используйте это, это ужасно)
Если вы действительно не хотите объявлять глобальную переменную, есть другая опция, может быть, не очень ортодоксальная :-), но она работает ... Вы можете объявить метод get & set следующим образом, со статической переменной внутри:
+ (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;
}
Итак, если вам нужно получить значение, просто позвоните:
NSString *testVal = [MyClass testHolder:nil]
И тогда, когда вы хотите установить его:
[MyClass testHolder:testVal]
Если вы хотите установить псевдостатическую переменную равной nil, вы можете объявить testHolder
так:
+ (NSString*)testHolderSet:(BOOL)shouldSet newValue:(NSString*)_test {
static NSString *test;
if(shouldSet) {
if(test != nil)
[test release];
test = [_test retain];
}
return test;
}
И два удобных метода:
+ (NSString*)test {
return [MyClass testHolderSet:NO newValue:nil];
}
+ (void)setTest:(NSString*)_test {
[MyClass testHolderSet:YES newValue:_test];
}
Надеюсь, поможет! Удачи.