Последствия значений int, не «подходящих» - bool или BOOL для Objective-C? - PullRequest
6 голосов
/ 24 февраля 2012

В комментариях здесь - https://stackoverflow.com/a/9393138/8047 - я обнаружил, что BOOL ведет себя неожиданно при установке его значения из значения int. В основном, если значение установлено на 0x1000, оно оценивается как FALSE (неожиданно).

NSLog(@"All zero? %d %d", (BOOL)0, (bool)0);
NSLog(@"All one? %d %d %d", (BOOL)4095, (BOOL)4096, (BOOL)4097); // 4096=0x1000 or 8-bits
NSLog(@"All one? %d %d %d", (bool)4095, (bool)4096, (bool)4097);

Produces:
All zero? 0 0
All one? -1 0 1
All one? 1 1 1

Я думаю, что это странно, но опять же, в любом случае, я не очень сильно разыгрываю от int до BOOL. Тем не менее:

  1. Означает ли это, что bool предпочтительнее BOOL? Почему или почему нет?
  2. Можно ли использовать

if (thatBool) {

или стоит отдать предпочтение

if (thatBool ? YES : NO) {

А почему?

Примечание: Это более конкретная версия этого вопроса: Objective-C: BOOL vs bool - но я думаю, что это добавляет к этому и не является дублировать.

Ответы [ 3 ]

3 голосов
/ 24 февраля 2012

Я думаю, что (BOOL)4096, вычисляемый как 0, является простым арифметическим переполнением, так же как (BOOL)256, поскольку BOOL является unsigned char. И я думаю, что уловка !! («двойное отрицание») работает нормально:

NSLog(@"%i", (BOOL)256); // 0
NSLog(@"%i", !!256); // 1

Это означает, что я буду использовать BOOL, чтобы сохранить стандартный стиль кодирования Какао и просто наблюдать за опасными типами. Выражение thatBool ? YES : NO ранит мне глаза, зачем тебе это делать? :)

2 голосов
/ 24 февраля 2012

1) bool - это тип C ++, BOOL - это тип Objective-C. Приведение от int к BOOL не работает должным образом, потому что YES это просто (BOOL)1 = (signed char)1 (= 0x001), а это, например, не равно (signed char)4 (= 0x100).

2) Оба будут работать, второе может быть нечитаемым для тех, у кого мало опыта в программировании. Я предпочитаю старую добрую проверку состояния безопасности в стиле c с константой слева, чтобы предотвратить случайное пропуск одного из знаков равенства.

if (YES == isEnabled) {

}
0 голосов
/ 24 февраля 2012

При использовании int вы всегда можете быть явным при установке BOOL, проверяя, равно ли int определенному значению, например,

BOOL yesNo = ((int)4096 > 0);
BOOL enableButton = (someInt >= 16);

Другими словами, не передавайте int вБУЛА напрямую;превратите это в истинное / ложное утверждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...