谓词在Cocoa ObjC中抛出异常

时间:2014-10-06 10:43:39

标签: objective-c cocoa

我有一个字典数组。我正在尝试像

这样的东西
ANY student.project_code BEGINSWITH[cd] "N8"

抛出的错误是

无法使用不是字符串的内容执行子字符串操作(lhs = <null> rhs = N8)

问题是一些学生没有项目代码。我如何摆脱这个错误?

1 个答案:

答案 0 :(得分:0)

您可以改为使用块谓词:

NSPredicate *p = [NSPredicate predicateWithBlock:BOOL ^(id evaluatedObject, NSDictionary *bindings) {
    return [((NSDictionary *)evaluatedObject)["@project_code"] hasPrefix:@"N8"];
}];

块谓词与普通谓词类似,除了不是针对每个对象评估谓词字符串,它只是调用您提供的自定义块,将其传递给当前正在测试的对象,如果是,则返回YES object符合您的规则,否则为NO。这为您提供了更大的灵活性,因为您可以在块中运行任何代码,并且不限于SQL风格的条件。

上面的代码创建了一个用于过滤字典数组的谓词,每个字典都有一个project_code键(如果键不存在,方法将返回nil,因此检查将为false,这正是无论如何你想要。)