首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用“空”谓词创建NSCompoundPredicate

如何使用“空”谓词创建NSCompoundPredicate
EN

Stack Overflow用户
提问于 2020-12-27 16:26:05
回答 2查看 433关注 0票数 2

我试图通过NSCompoundPredicate将更多的独立谓词组合到一个谓词中,但可能会出现一个或多个谓词未被构造的情况,因为应该从CoreData实体检索所有对象(因此实际上不需要谓词)。

代码语言:javascript
运行
复制
if isGenreFilterOn {
    genrePredicate = NSPredicate(format: "genID == \(genreID)")
}
if searchFor != "" {    
    bookPredicate = NSPredicate(format: "bokName CONTAINS[cd] %@", searchFor)
}
let predicate = NSCompoundPredicate(type: .and, subpredicates: [genrePredicate, bookPredicate])

如果没有构造任何谓词,App就会失败。避免许多if子句的最佳方法是什么,我是应该构造谓词从实体检索所有对象,还是有任何聪明的方法?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-27 18:00:53

与创建“空”谓词不同,您可以动态构建只包含所需谓词的数组:

代码语言:javascript
运行
复制
var predicates = [NSPredicate]() // Start with empty list.
if isGenreFilterOn {
    // Add genre predicate:
    predicates.append(NSPredicate(format: "genID == \(genreID)"))
}
if !searchFor.isEmpty {
    // Add book predicate:
    predicates.append(NSPredicate(format: "bokName CONTAINS[cd] %@", searchFor))
}
// ... more criteria ...

// Combine all predicates:
let predicate = NSCompoundPredicate(type: .and, subpredicates: predicates)

可以很容易地添加更多的可选(或非可选)条件。即使谓词数组为空,此操作也是正确的。

注:要小心谓词格式字符串中的字符串内插。

代码语言:javascript
运行
复制
NSPredicate(format: "genID == \(genreID)")

如果genreID是一个数字,就可以了,但是如果它是一个字符串,并且包含任何特殊字符或为谓词保留的关键字,则可以在运行时崩溃。

票数 3
EN

Stack Overflow用户

发布于 2020-12-27 16:57:24

您所称的空谓词总是计算为“true”。您可以这样做--在不需要的时候使用NSPredicate(value: true)代替任何一个谓词。对于一个始终为真的谓词,您的复合计算另一个。如果两者都为真,则复合词始终为真,这与没有谓词是一样的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65467895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档