Ответ 1
Двойной логический оператор просто гарантирует, что возвращаемое значение равно либо 1, либо 0. Что все:)
Я просматриваю различия, представленные в проекте другим разработчиком, и у них много кода, который делает !!<some BOOL value>
. Фактически, это, по-видимому, является их стандартной моделью для реализации булевых getters и seters. Они внедрили свой код, например:
- (BOOL) hasId {
return !!hasId_;
}
- (void) setHasId:(BOOL) value {
hasId_ = !!value;
}
Я никогда не видел этот шаблон раньше, и мне интересно, есть ли какая-нибудь польза в его использовании. Является ли двойное отрицание полезным?
Двойной логический оператор просто гарантирует, что возвращаемое значение равно либо 1, либо 0. Что все:)
!
- оператор логического отрицания. Так что если setHasId: был передан, например, 0x2, тогда двойное отрицание будет хранить 0x1.
Это эквивалентно:
hasId_ = value ? 1 : 0;
Это полезно в некоторых случаях, потому что если вы это сделаете:
BOOL x = y & MY_FLAG;
Вы можете получить 0, если MY_FLAG
установлено, потому что результат усечен до размера BOOL
(8 бит). Это неожиданно. По тем же причинам люди иногда предпочитают, чтобы BOOL
был либо 0, либо 1 (так что операции бит работают, как ожидалось). Обычно это не нужно.
В языках со встроенным типом BOOL
, таким как C (с C99) и С++, преобразование целого числа в BOOL
выполняется автоматически.
Это имеет смысл в некоторых других случаях, например, когда вы возвращаете BOOL
, но не хотите вставлять оператор if
.
- (BOOL)isMyVarSet
{
return !!myVar;
}
В этом случае я не могу просто вернуть myVar
, потому что это не BOOL
(это очень надуманный пример - я не могу откопать достойный от своих проектов).
Я использовал это раньше, и я верю:
if (!!myVar)
эквивалентно:
if (myVar != nil)
В основном, я использую его для проверки значения SOMETHING.
Я признаю... это, вероятно, не лучшая практика или наиболее понятный способ достижения этой цели.