Перечисляемый тип как статическая переменная в Objective-C

#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. Спасибо за вашу помощь 🙂