Boolean в Objective-C является удержанием типа данных из языка C. И в C, и, следовательно, в Objective-C 0 (ноль) рассматривается как «ложь», а 1 (единица) — как «истина».

C имеет логический тип данных, bool (примечание: нижний регистр), который может принимать значения true и false. Objective-C предоставляет несколько иную версию аналогичного типа, написанную как BOOL (примечание: все заглавные), которая принимает макросы YES или NO. BOOL в Objective-C на самом деле является просто определением типа (typedef) для знакового символьного типа (signed char), который использует 8 бит памяти (или 1 байт).

Подписанный символ? Вы помните подписанные и неподписанные? Это квалификаторы типа данных (также известные как необязательные спецификаторы). Чтобы освежить вашу память, эти квалификаторы записываются перед типом данных, чтобы расширить или уменьшить диапазон значений, доступных для переменной (в некоторых компьютерных системах).

Почему? Первоначальные разработчики Objective-C не хотели определять тип BOOL (из C) для char. В одних системах под одними компиляторами char был знаковым, а под другими беззнаковым. Дизайнерам нужен был конкретный результат, который должен был возвращать согласованное значение на всех платформах, поэтому они включили подписанность в typedef.

Ниже приведена таблица, в которой отмечены основные вариации стандартных целочисленных типов char с размерами их хранилищ и диапазонами значений.

Где что-то может пойти не так

Итак, у нас есть C — bool и Objective C — BOOL. Оба могут существовать в одной и той же программе! Это наша первая причина для беспокойства. (Первая? Есть еще?) Да. Чтобы преодолеть этот глюк / ловушку, обязательно обратите внимание на случай при использовании в Objective-C.

Хорошо, теперь мы переходим ко второй проблеме.

Мы заново ознакомились со спецификациями типа данных BOOL: это signed char, 1 байт (8 бит), в диапазоне от -128 до 127.

Это может вызвать проблему при использовании BOOL в условных операторах, где мы проверяем if, while, for и т. д.

Проблемы возникают из-за утверждения YES. Как мы отмечали выше, BOOL — это макроопределение подписанного char, что означает, что может иметь более двух значений. Хотя сопоставление NO/FALSE == 0, YES/TRUE == может варьироваться от -128 до 127. Это широкий диапазон.

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

Давайте создадим визуальный элемент, чтобы убедиться, что он сохраняется.

Выше показано, что такое любое ненулевое значение.

Итак, повторюсь…

-128 to -1

— or —

1 to 127

приравнивается к ДА. (Рассматривайте любое ненулевое значение как истинное.)

Мы уже уладили это, верно?