Objective-C - Является ли!! BOOL полезным

Я просматриваю различия, представленные в проекте другим разработчиком, и у них много кода, который делает !!<some BOOL value>. Фактически, это, по-видимому, является их стандартной моделью для реализации булевых getters и seters. Они внедрили свой код, например:

- (BOOL) hasId {
    return !!hasId_;
}
- (void) setHasId:(BOOL) value {
    hasId_ = !!value;
}

Я никогда не видел этот шаблон раньше, и мне интересно, есть ли какая-нибудь польза в его использовании. Является ли двойное отрицание полезным?

Ответы

Ответ 1

Двойной логический оператор просто гарантирует, что возвращаемое значение равно либо 1, либо 0. Что все:)

Ответ 2

! - оператор логического отрицания. Так что если setHasId: был передан, например, 0x2, тогда двойное отрицание будет хранить 0x1.

Ответ 3

Это эквивалентно:

hasId_ = value ? 1 : 0;

Это полезно в некоторых случаях, потому что если вы это сделаете:

BOOL x = y & MY_FLAG;

Вы можете получить 0, если MY_FLAG установлено, потому что результат усечен до размера BOOL (8 бит). Это неожиданно. По тем же причинам люди иногда предпочитают, чтобы BOOL был либо 0, либо 1 (так что операции бит работают, как ожидалось). Обычно это не нужно.

В языках со встроенным типом BOOL, таким как C (с C99) и С++, преобразование целого числа в BOOL выполняется автоматически.

Ответ 4

Это имеет смысл в некоторых других случаях, например, когда вы возвращаете BOOL, но не хотите вставлять оператор if.

- (BOOL)isMyVarSet
{
    return !!myVar;
}

В этом случае я не могу просто вернуть myVar, потому что это не BOOL (это очень надуманный пример - я не могу откопать достойный от своих проектов).

Ответ 5

Я использовал это раньше, и я верю:

if (!!myVar)

эквивалентно:

if (myVar != nil)

В основном, я использую его для проверки значения SOMETHING.

Я признаю... это, вероятно, не лучшая практика или наиболее понятный способ достижения этой цели.