我经常在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对象的行被忽略?
答案 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];