Cor*_*oyd 24 cocoa cocoa-touch objective-c nsarray nspredicate
有没有办法构造一个谓词来按类类型过滤?
我目前循环遍历数组并检查每个对象的类.也许有更干净的方式?
Ash*_*ark 76
您也可以在谓词中直接比较类.
但是,如果您尝试过滤属于类集群的对象或者您有子类,它可能无法正常工作.
例如,NSDate实例化时通常是一个__NSCFDate并且NSString可以NSCFString与其他特定的私有类一样.
最好自己循环使用该套件并将其-isKindOfClass:用作测试.
如果你真的想使用NSPredicate虽然你可以这样做.作为示例,这将过滤从中派生的所有对象的数组NSString.如果你想严格类会员,你可以替换isKindOfClass:使用isMemberOfClass:.
集合中的所有对象实现的任何选择器,接受一个参数并返回一个BOOL应该工作.
NSArray *mixedArray = {...};
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"self isKindOfClass: %@",
[NSString class]];
NSLog(@"%@", [mixedArray filteredArrayUsingPredicate:predicate]);
Run Code Online (Sandbox Code Playgroud)
Car*_*zey 27
从iOS 4和Mac OS 10.6开始,也可以使用+[NSPredicate predicateWithBlock:].例如:
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id object, NSDictionary *bindings) {
return [object isKindOfClass:[NSString class]];
}];
Run Code Online (Sandbox Code Playgroud)
这允许您纯粹在Objective-C中表达谓词,而不是表达所需的谓词语法predicateWithFormat:.
Dav*_*ong 22
您可以向NSObject添加一个类别,添加"cf_className"方法,如下所示:
@interface NSObject (CFAdditions)
- (NSString *) cf_className;
@end
@implementation NSObject (CFAdditions)
- (NSString *) cf_className {
return NSStringFromClass([self class]);
}
@end
Run Code Online (Sandbox Code Playgroud)
从那里,你可以使用谓词,如:
NSPredicate * p = [NSPredicate predicateWithFormat:@"cf_className = %@", aClass];
NSArray * filtered = [anArray filteredArrayUsingPredicate:p];
Run Code Online (Sandbox Code Playgroud)
如果您使用的是Mac,则可以使用-[NSObject className]而不必创建类别.iPhone没有这种方法,因此需要一个类别.
| 归档时间: |
|
| 查看次数: |
11294 次 |
| 最近记录: |