Почему setValue в registerDefaults выдает мне предупреждение с BOOL YES?

#objective-c #ios

#objective-c #iOS

Вопрос:

В моем коде есть следующие строки:

 [registerDefaults setValue:NO forKey:UserDefaultsGameSortAscendingKey];
[registerDefaults setValue:YES forKey:UserDefaultsReminderSortAscendingKey];
  

Почему я получаю предупреждение во второй строке, а не в первой?

Несовместимое преобразование целого числа в указатель

Оба UserDefaultsGameSortAscendingKey и UserDefaultsReminderSortAscendingKey определяются как константы:

 extern NSString *const UserDefaultsGameSortAscendingKey;
extern NSString *const UserDefaultsReminderSortAscendingKey;
  

Ответ №1:

Вам нужно обернуть BOOLs в NSNumbers, чтобы сохранить их в значения по умолчанию:

 [registerDefaults setValue:[NSNumber numberWithBool:NO] forKey:UserDefaultsGame...];
[registerDefaults setValue:[NSNumber numberWithBOOL:YES] forKey:UserDefaultsGame...];
  

Комментарии:

1. Ваш код правильный, но это не приведение. Точнее было бы сказать, что вам нужно обернуть BOOL.

2. Разъяснение отражено в правке. Однако мое определение «приведения» в значительной степени соответствует определению Википедии: в информатике преобразование типов, приведение типов и принуждение относятся к различным способам, неявно или явно, изменения сущности одного типа данных в другой.

3. По крайней мере, в языках, производных от C, «приведение» относится к изменению типа чего-либо без фактического изменения представления в памяти. Однако в этом случае вы оборачиваете значение BOOL NSNumber объектом, и результирующее значение имеет представление в памяти, отличное от исходного BOOL.

4. Этот процесс (переноса) также называется упаковкой: en.wikipedia.org/wiki /…

5. @KevinBallard, безусловно, полезное отличие от C, и я соответствующим образом изменил ответ. Термин чугун является, пожалуй, меньше сторона (отсюда и поправка), но все равно полезно, чтобы описать это общее понятие вычисления, особенно тому, кто не может быть разбирается в C, но на кого «бросили» уже может быть понято и так понято быстрее, чем термины «перенос» или «коробка», которые точнее точного, но менее очевидно с кем-то не знакомы.

Ответ №2:

Вам следует использовать setBool:forKey: . Это устранит предупреждение (причину которого объясняет ответ @isaac), сэкономит ваше время на написание кода и будет менее подвержено ошибкам, поскольку любое приведение / преобразование выполняется за вас:

 [registerDefaults setBool:NO forKey:UserDefaultsGameSortAscendingKey];
[registerDefaults setBool:YES forKey:UserDefaultsReminderSortAscendingKey];
  

Из документов NSUserDefaults:

 setBool:forKey:
  

Устанавливает значение указанного ключа по умолчанию в указанное логическое значение
значение.

 - (void)setBool:(BOOL)value forKey:(NSString *)defaultName
  

value
Логическое значение для сохранения в базе данных по умолчанию.

defaultName
Ключ, с которым нужно связать значение.

Комментарии:

1. Я предполагаю, что registerDefaults в исходном вопросе указывается словарь, используемый для установки значений по умолчанию с помощью метода: - (void)registerDefaults:(NSDictionary *)dictionary . К сожалению, - (void)setBool:(BOOL)value forKey:(NSString *)defaultName не может быть использовано в этом случае.

2. @A может быть обычным dict или NSUserDefaults, думаю, мы не узнаем без уточнения OP. Однако отклонение голосов, основанное на предположении, которое не может быть подтверждено, неверно. Отрицательные отзывы следует использовать к ответам, которые явно неверны, низкого качества, являются спамом и т.д.

Ответ №3:

Да, как указывали другие, вам следует использовать setBool:forKey: или обернуть BOOL в NSNumber . Теперь, чтобы ответить на ваш актуальный вопрос:

setValue: forKey: определяется как:

 - (void)setValue:(id)value forKey:(NSString *)key
  

значение имеет идентификатор типа, который является указателем на любой объект. Значение NO равно 0 или nil, что является допустимой версией для переменной типа id (или любого указателя). Значение YES равно 1, что не является допустимым значением для переменной типа id. Отсюда и предупреждение.