#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];
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. Отсюда и предупреждение.