我有NSSet
个名为SCPFLocation
的自定义对象,我希望使用每个位置的人类可读格式(名为interpretedForm
的属性)对其进行过滤。以下是我的表现:
NSMutableSet *set = [[SCPFLocation allLocations] mutableCopy];
[set filterUsingPredicate:[NSPredicate predicateWithFormat:@"interpretedForm contains[c] '%@'", searchString]];
self.matches = [set.allObjects sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [((SCPFLocation *)obj1).interpretedForm compare:((SCPFLocation *)obj2).interpretedForm];
}];
但我无法弄清楚为什么这不起作用。到应用谓词过滤器时,set
包含零个对象。我能做错什么?
SCPFLocation
是SCPFValue
的子类,SCPFLocation
从中继承并覆盖interpretedForm
属性。以下是@interface
的{{1}}和@implementation
。
SCPFLocation
@interface SCPFLocation : SCPFValue
@property (strong, nonatomic) NSString *province;
@property (strong, nonatomic) NSString *city;
@end
@implementation SCPFLocation
- (NSString *)interpretedForm
{
if (self.city) {
return [NSString stringWithFormat:@"%@, %@", self.city, self.province];
} else {
return self.province;
}
}
@end
:
SCPFValue.h
答案 0 :(得分:0)
您不必像这样在块内投射对象。我觉得这个表格更容易阅读。
NSMutableSet *set = [[SCPFLocation allLocations] mutableCopy];
[set filterUsingPredicate:[NSPredicate predicateWithFormat:@"interpretedForm contains[c] '%@'", searchString]];
self.matches = [set.allObjects sortedArrayUsingComparator:^NSComparisonResult(SCPFLocation *obj1, SCPFLocation *obj2) {
return [obj1.interpretedForm compare:obj2.interpretedForm];
}];
说完了。那里什么都没有用。它怎么不起作用?
您能否展示一个无法正常工作的对象和搜索字符串的示例。
答案 1 :(得分:0)
自己想出来,答案非常令人沮丧。而不是以这种方式定义谓词:
[NSPredicate predicateWithFormat:@"interpretedForm contains[c] '%@'", searchString]
我是这样做的:
[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"interpretedForm contains[c] '%@'", searchString]]
和它一起工作。我不知道为什么第一种形式在Apple的Predicate Format String Syntax之后很有问题。