我可以使用nif参数在Swift中使用NSPredicate吗?

时间:2014-07-10 18:53:51

标签: core-data swift nspredicate

我正在尝试将使用Core-Data的项目从Objective-C转换为Swift。

数据模型的结构使我有一个包含其他文件夹的主文件夹 - 这些文件夹也可以通过“parentFolder”关系包含其他文件夹。

目前,我在Objective-C中执行此操作以检索主文件夹(它找到唯一没有“parentFolder”的文件夹,并按预期工作):

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:"Folder"];
request.predicate = [NSPredicate predicateWithFormat:@"parentFolder == %@", nil];

在转换为Swift时,我想做同样的事情:

let request = NSFetchRequest(entityName: "Folder")
request.predicate = NSPredicate(format: "parentFolder == %@", nil)

...但编译器抱怨“缺少参数标签'argumentArray:'在调用中。(我似乎在混淆它认为我需要使用NSPredicate(格式:argumentArray :)方法而不是......)< / p>

在Swift中有没有正确的方法?

2 个答案:

答案 0 :(得分:34)

看起来好像是(当前的Xcode 6 beta 3版本)通常很难 在可变参数列表中传递nil

这个似乎可以工作:

let predicate = NSPredicate(format: "parentFolder == %@", 0)
print(predicate)
// Output: parentFolder == nil

最简单的解决方案就是简单地将谓词写为

NSPredicate(format: "parentFolder == nil")

答案 1 :(得分:2)

最简单的解决方案和适合您的情况就是将谓词写为:

NSPredicate(format: "parentFolder == nil")

但是,如果有必要插入nil作为参数,则可以使用NSNull。如果您使用的是可选

,这可能会很有用
let folderName: String? = nil
// ... assign folderName if available
NSPredicate(format: "parentFolder == %@", folderName ?? NSNull())

这将导致所有文件夹具有相同的父文件夹,如果父文件夹为nil,则将获取所有没有父文件夹的文件夹。