Null отличается от false в логических значениях? - PullRequest
1 голос
/ 13 января 2012

У меня есть метод для создания почтового запроса. Этот запрос может иметь x количество параметров, но ни один из них не является обязательным. Есть параметры типа boolean (они передаются в виде строк со значениями «true» или «false» (не мое решение, это API).

Вот проблема. Объявление моего метода содержит все параметры, которые принимаются как часть запроса post. Проблема заключается в том, что запрос возвращает разные результаты, если логический параметр равен true, равен false или отсутствует.

Идентификатор моего метода что-то вроде

-(void) createRequestWithID:(NSString *)id translate(NSNumber *)translate onlyLastVersions:(NSNumber *)onlyLastVersions

Мой метод является частью фреймворка, который будет использоваться и вызываться другими разработчиками. Это означает, что я не могу контролировать то, что они передают параметрам, таким как translate, который является логическим (я использую NSNumber в качестве оболочки).

И тут возникает проблема. Мне нужно иметь возможность определить, был ли метод pasing translate как true, false или nil. Потому что для этих случаев у меня будет запрос как translate = "true", translate = "false" или перевод не будет присутствовать в запросе.

Мне нужен способ различать истину, ложь и ноль.

Тестируя на gbd, чтобы попытаться найти способ его дифференцировать, я получаю:

(gdb) p translateFALSE $ 5 = (NSNumber *) 0x0

(gdb) p translateNIL $ 6 = (NSNumber *) 0x0

(gdb) po translateFALSE Невозможно напечатать описание объекта NIL.

(gdb) po translateNIL Невозможно распечатать описание объекта NIL.

(gdb) po [класс translateFALSE] Невозможно напечатать описание объекта NIL.

(gdb) po [класс translateNIL] Невозможно напечатать описание объекта NIL.

Так что я не вижу способа сделать это.

Ответы [ 3 ]

3 голосов
/ 13 января 2012
if( translate ) {
  if( [translate boolValue] ) {
    // translate is present and is set (YES)
  } else {
    // translate is present and is not set (NO)
  }
} else {
  // translate is nil / not present
}

Если вы предпочитаете, чтобы это больше походило на трехстороннюю ветвь:

if( [translate boolValue] ) {
  // translate is present and is set (YES)
} else if( translate ) {
  // translate is present and is not set (NO)
} else {
  // translate is nil / not present
}
1 голос
/ 13 января 2012

Если вы передаете NSNumber, это объект. Вы можете легко различать наличие объекта или нулевое значение. (Сделайте это до того, как попытаетесь извлечь значение объекта.)

1 голос
/ 13 января 2012

Не существует такой вещи, как NULL (или nil) для логического значения - NULL является значением указателя.NSNumber может быть ноль, но NSNumber, представляющий BOOL NO, не будет ноль.

...