p0l*_*ris 4 predicate objective-c ios
考虑下面的数组.数组包含"Alpha"类型的对象.我们只关心username类型的财产NSString.
NSArray *some_usernames = @[ <multiple values of type Alpha> ]
NSArray *all_usernames = @[ <multiple values of type Alpha> ]
Run Code Online (Sandbox Code Playgroud)
我基本上想要一个不在数组中的所有用户名的列表some_usernames,即
NSArray *remaining_usernames = @[ <all_usernames but not in some_usernames> ];
Run Code Online (Sandbox Code Playgroud)
我打算做的方式是:
NSPredicates *predicates;
for (Alpha *alpha in some_usernames)
{
predicate = [predicate with @"username != %@", alpha.username];
predicates.add(predicate)
}
create compound predicate
filter all_usernames
Run Code Online (Sandbox Code Playgroud)
但这感觉就像这样做的坏方法.有两种方法可以做到这一点吗?我以前见过它但我不能再指向代码引用了.
Vik*_*ica 13
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"not (self.username IN %@)", [some_usernames valueForKey:@"username"]];
NSArray *remaining_usernames = [all_usernames filteredArrayUsingPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)
完整的例子
@interface Alpha : NSObject
@property (nonatomic, copy) NSString *username;
-(instancetype) initWithUsername:(NSString *)username;
@end
@implementation Alpha
-(instancetype) initWithUsername:(NSString *)username
{
self = [super init];
if (self) {
self.username = username;
}
return self;
}
-(NSString *)description{
return [NSString stringWithFormat:@"%@: %@", NSStringFromClass([self class]), self.username];
}
@end
NSArray *all_usernames = @[[[Alpha alloc] initWithUsername:@"a"], [[Alpha alloc] initWithUsername:@"b"], [[Alpha alloc] initWithUsername:@"z"], [[Alpha alloc] initWithUsername:@"f"], [[Alpha alloc] initWithUsername:@"e"]];
NSArray *some_usernames = @[[[Alpha alloc] initWithUsername:@"b"], [[Alpha alloc] initWithUsername:@"f"]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"not (self.username IN %@)", [some_usernames valueForKey:@"username"]];
NSArray *remaining_usernames = [all_usernames filteredArrayUsingPredicate:predicate];
NSLog(@"%@", remaining_usernames);
Run Code Online (Sandbox Code Playgroud)
版画
(
"Alpha: a",
"Alpha: z",
"Alpha: e"
)
Run Code Online (Sandbox Code Playgroud)