Как уже отмечали другие, object != nil && object != NSNull.null
даст вам ожидаемое поведение, однако это может быть утомительно и подвержено ошибкам при записи этой пары условий каждый раз.
В качестве альтернативы вы можете использовать инвертированную логику,добавив метод nonNullValue
практически ко всем объектам в системе:
// in some header file
@interface NSObject(NullExtension)
- (instancetype)nonNullValue;
@end
// in some implementation file
@implementation NSObject(NullExtension)
// regular objects are not null (right?)
- (instancetype)nonNullValue {
return self;
}
@end
@implementation NSNull(NullExtension)
// let's make NSNull report as being null
- (instancetype)nonNullValue {
return nil;
}
@end
// adding this just for the sake of completeness, it's highly unlikely
// that JSON's will decode NSProxy instances
@implementation NSProxy(NullExtension)
- (instancetype)nonNullValue {
return self;
}
@end
, вы можете просто использовать его в своих указателях:
// since we're in Objective-C, a nil pointer will always fail the check
// and thanks to the NSNull extension, NSNull instances will behave the same
if ([object nonNullValue] != nil) {
// NSNull won't get here
// nils won't get here
// other objects will get here
}
Этот подход несколько инвазивенпоскольку он затрагивает все подклассы NSObject
, он устраняет необходимость написания нескольких условий.