检查nil指针的多个对象,只设置非零

时间:2014-08-21 06:20:49

标签: ios objective-c

我经常在Objective C中使用自定义类,例如包含姓名,电话号码,电子邮件等的联系人类,查找如下例子:

NSString *firstName;
NSString *familyName;
NSString *emailAddress; 
...

为了将这些值放入数组中,我必须这样做:

if (firstName) [someArray addObject:firstName];
if (familyName) [someArray addObject:familyName];
if (emailAddress) [someArray addObject:emailAddress];
...

有没有办法做更像的事情:

for (not nil objects) {
    [someArray addObject:firstName];
    [someArray addObject:familyName];
    [someArray addObject:emailAddress];
    ...
}

哪些包含nil对象的行被忽略?

1 个答案:

答案 0 :(得分:3)

根据您喜欢的静态糖,有多种方法可以实现这一目标。

首先,您可以在NSArray上实施一个类别,该类别会添加addObjectIfNotNil:方法,在这种情况下,您的代码最终将成为:

[someArray addObjectIfNotNil:firstName];
[someArray addObjectIfNotNil:familyName];
[someArray addObjectIfNotNil:emailAddress];

如果您想要一些不那么重要的东西,可以查看NSPredicate

id v1 = @1, v2=@2, v3 = nil, v4 = @3, v5 = @4, v6 = nil;

NSPredicate* notnil = [NSPredicate predicateWithBlock:^BOOL(id obj, __unused NSDictionary* bindings) {
    return ![obj isEqual:[NSNull null]];
}];

NSArray* values = @[
    (v1) ?: [NSNull null],
    (v2) ?: [NSNull null],
    (v3) ?: [NSNull null],
    (v4) ?: [NSNull null],
    (v5) ?: [NSNull null],
    (v6) ?: [NSNull null],
];

values = [values filteredArrayUsingPredicate:notnil];