Objective-C - это !! BOOL выгодно - PullRequest
14 голосов
/ 13 июля 2011

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

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

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

Ответы [ 5 ]

13 голосов
/ 13 июля 2011

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

3 голосов
/ 13 июля 2011

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

1 голос
/ 13 июля 2011

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

hasId_ = value ? 1 : 0;

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

BOOL x = y & MY_FLAG;

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

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

0 голосов
/ 13 июля 2011

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

if (!!myVar)

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

if (myVar != nil)

По сути, я использую его для проверки значения ЧТО-ТО.

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

0 голосов
/ 13 июля 2011

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

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

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

...