Подтвердить что ты не робот

Тестирование равенства с NSNull

Ниже приведен блок кода, который должен проверять, чтобы узнать, является ли словарь нулевым, а если нет, вытащите правильный объект. Однако по какой-то причине, несмотря на то, что проверка if не выполняется, код все еще выполняется. Есть ли какая-то причуда, с которой работает NSNull, что я не понимаю, или это ошибка Apple?

if (svcUser && !(svcUser == (id)[NSNull null])) {
    return [svcUser objectForKey:@"access_level"];
}

Ответ консоли:

(lldb) print svcUser && !(svcUser == (id)[NSNull null])
(bool) $0 = false
(lldb) continue
-[NSNull objectForKey:]: unrecognized selector sent to instance 0x2b51678
4b9b3361

Ответ 1

Просто проверьте:

svcUser == [NSNull null]

Это тот подход, который Apple упоминает в своих docs.

Ответ 2

NSNull - это класс. И как со всеми классами, вы должны использовать isEqual:, а не ==, чтобы увидеть, представляют ли два объекта одинаковое значение.

if (svcUser && ![svcUser isEqual:[NSNull null]]) {
    return [svcUser objectForKey:@"access_level"];
}

Ответ 3

Вы можете проверить это, используя:

 if(![svcUser isKindOfClass:[NSNull class]]){
    return [svcUser objectForKey:@"access_level"];
}

Ответ 4

Использование подхода @JE42 дает мне предупреждение относительно Xcode 5.1. Вместо этого сделайте это:

(id)svcUser == [NSNull null]