Мне интересно, зачем нужны двойные восклицательные знаки?
BOOL
- это signed char
или char
, выдавая себя за логический тип через typedef
. Он с радостью будет представлять любое целое число в диапазоне [SCHAR_MIN...SCHAR_MAX]
. Двойной восклицательный знак дважды применяет логическую операцию NOT, которая эффективно преобразует исходное значение в целое число 0 или 1, сужая значение до диапазона логического значения.
Но есть поворот: BOOL hasValue_:1;
объявляет однобитовое представление битового поля. Он может представлять два значения. return !!hasValue_;
не требуется. Однако при переходе от signed char
(BOOL
) к одному биту необходимо правильное сужение.
Разве мы не передаем BOOL методу и возвращаем BOOL?
Неа. Это signed char
. !!value
уменьшает входные значения до YES
или NO
.
Если я уже работаю с BOOL, почему необходимо нормализовать его до 0 для false и 1 для true?
Разве BOOL не гарантирует, что оно ложно для 0 и верно для всего остального?
BOOL
является signed char
. typedef
из signed char
не дает этой гарантии.
C99 (который вы можете использовать в течение многих лет при настройке на osx или ios) имеет более полезное представление логического типа (bool
). К сожалению, BOOL
по-прежнему регулярно используется в объектах по историческим причинам. Лично я использую BOOL
только при необходимости (например, переопределение).