Я знаю, что он поддерживает автоматические переменные, но как насчет переменных класса?
Поддерживает ли переменные класса Objective-C?
Ответ 1
Язык не поддерживает переменные класса. Вы реализуете состояние класса с глобальными переменными static
в единицах компиляции реализации.
В заголовке (файл .h):
@interface MyClass : NSObject
+(int)val;
@end
В реализации (файл .m):
static int val = 123;
@implementation MyClass
+(int)val {return val;}
@end
Использование:
if ([MyClass val] > 100) ...
Ответ 2
Переменные класса objC представляют собой простые старые статические переменные.
Foo.m
:
static int foo = 0;
В качестве альтернативы вы можете использовать анонимное пространство имен С++, если вы используете ObjС++:
Foo.mm
:
namespace {
int foo = 0;
}
Но есть еще один шаблон, если вы хотите воспользоваться преимуществами свойств:
Foo.h
:
@interface FooShared
@property ( atomic, readwrite, strong ) Foo* foo;
@end
@interface Foo
+ (FooShared*) shared;
@end
Foo.m
:
@implementation FooShared
@end
static fooShared* = nil;
@implementation Foo
+ (FooShared*) shared
{
if ( fooShared == nil ) fooShared = [FooShared new];
return fooShared;
}
@end
somewhere.m
:
Foo* foo …;
foo.shared.foo = …;
Это может показаться немного излишним, но это интересное решение. Вы используете те же конструкции и языковые функции как для свойств экземпляра, так и для свойств класса. Атомация по требованию, аксессоры при необходимости, отладка, точки останова... Наследование даже.
Творческие умы могут найти другие способы сделать все это, я полагаю.:) Но вы в значительной степени охвачены этими параметрами.
Ответ 3
@property (class, nonatomic, copy) NSString *someStringProperty;
Но вы должны предоставить getter и setter
Из примечаний к выпуску Xcode 8: Objective-C теперь поддерживает свойства класса, которые взаимодействуют со свойствами типа Swift. Они объявляются как: @property (класс) NSString * someStringProperty;. Они никогда не синтезируются. (23891898)
Ответ 4
Свойства класса были добавлены назад в Xcode 8.x. Это не намного больше, чем если бы вы писали свои собственные сеттеры и геттеры как методы классов и использовали статику для хранения. На самом деле, все, что есть, кроме сообщений компилятора, см. ниже.
Objective-C теперь поддерживает свойства класса, которые взаимодействуют со свойствами типа Swift. Они объявлены как @property (class) NSString * someStringProperty; и никогда не синтезируются. (23891898)
@interface MyClass
@property (class) NSObject *someClassProperty;
@property (class, readonly) NSString *aReadClassProperty;
@end
Если вы не добавите требуемые методы получения/установки, вы увидите следующие ошибки:
Свойство класса 'aReadClassProperty' требует определения метода 'aReadClassProperty' - используйте @dynamic или предоставьте реализацию метода в этой реализации класса
Для свойства класса 'someClassProperty' требуется определить метод 'setSomeClassProperty:' - используйте @dynamic или предоставьте реализацию метода в этой реализации класса
Для свойства класса 'someClassProperty' требуется определить метод 'someClassProperty' - используйте @dynamic или предоставьте реализацию метода в этой реализации класса
в вашей реализации вам понадобится:
@implementation MyClass
static NSObject *object;
+ (void)setSomeClassProperty:(NSObject *)someClassProperty {
object = someClassProperty;
}
+ (NSObject *)someClassProperty {
return object;
}
static NSString *string = @"My class string";
+ (NSString *)aReadClassProperty {
return string;
}