#objective-c #enums #static-members
#objective-c #перечисления #статические члены
Вопрос:
Мне нужна статическая переменная, которая содержит перечисляемый тип для доступа и изменения другими классами. В настоящее время я могу получить доступ к его значению, но когда я пытаюсь его изменить, новое значение не сохраняется. Класс, в котором он объявлен, не создан.
Это объявление enum:
typedef NS_ENUM(NSInteger, weaponType) {
single, dual
};
У меня есть статический получатель и установщик, объявленные в файле .h:
(weaponType)shipWeaponType;
(void)setShipWeaponType:(int)aType;
В файле .m у меня есть статическая переменная
static weaponType shipWeaponType;
А средство получения и установки реализовано следующим образом:
(weaponType)shipWeaponType {
return shipWeaponType;
}
(void)setShipWeaponType:(int)aType {
shipWeaponType = aType;
}
shipWeaponType
всегда возвращает 0. Я пытался, setShipWeaponType
требуя фактического типа перечисления, а не int, но это не имеет значения.
Любая помощь была бы высоко оценена!
Комментарии:
1. Я попробовал ваш код и получил 1 в качестве возвращаемого результата с первой попытки. Должно быть, у вас где-то произошла какая-то простая ошибка. Приведенный вами код работает хорошо
2. Мой нулевой смысл покалывает.
3. @Chuck но это методы класса. класс не может быть нулевым
4. @AndreyChernukha: Переменная, которая, по вашему мнению, указывает на класс, может быть равна нулю. Это правда, что для получения нулевой ссылки на класс требуется несколько необычных вариантов выбора, но это уже довольно странный дизайн, и ясно, что здесь происходит что-то странное, что (как сообщалось) работает точно так же, как нулевая ссылка.
5. @user2576824: Учитывая, что никто не может воспроизвести эту проблему из кода, который вы предоставили здесь, вам нужно предоставить лучший пример кода, который люди могут использовать, если вы хотите, чтобы кто-нибудь рассказал вам, что происходит.
Ответ №1:
Я подозреваю, что вы просто упускаете что-то очевидное, поскольку то, что у вас есть, выглядит так, как будто это должно работать. Я просто быстро выполнил тест в одном классе внутри проекта sprite kit по умолчанию, так как он был открыт у меня, и это сработало. Вот как это выглядит:
//======= .h ==========
typedef NS_ENUM(int, testEnumType){
nullType,
oneType,
twoType,
initType,
};
@interface MyScene : SKScene
(void)setStaticVar:(int)var;
(testEnumType)getStaticVar;
//========= .m ==============
static testEnumType theStaticVar = initType;
@implementation MyScene
(void)setStaticVar:(int)var
{
theStaticVar = var;
}
(testEnumType)getStaticVar
{
return theStaticVar;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[MyScene setStaticVar:oneType];
NSLog(@"the var: %i", [MyScene getStaticVar]); //result is the var: 1
}
Комментарии:
1. Похоже, что установщик присваивает значение в-method, но при повторном обращении к переменной оно возвращается к 0. Я установил его следующим образом:
[GameAdmin setShipWeaponType:dual];
— такой же, как у вас, поэтому я не понимаю, почему мой не работает.2. Во-первых, когда вы объявляете статическую переменную, установите для нее значение, отличное от 0, это поможет вам понять, смотрите ли вы на какую-то неясную нулевую ссылку на нее, или значение действительно возвращается. Но я проверю ваш вариант использования, просто чтобы убедиться, что я ничего не упускаю. РЕДАКТИРОВАТЬ — нет, все работает во всех случаях. Вы либо указываете на нулевую ссылку на класс, либо устанавливаете значение где-то в другом месте, либо устанавливаете его не так, как вы думаете. Убедитесь, что вы ведете NSLog на каждом шаге.
3. Я разобрался с некоторыми NSLogs. Класс, из которого я получал доступ к переменной, был загружен из CCB до того, как класс, который я использовал для установки переменной, был загружен из CCB. Спасибо за вашу помощь 🙂