我能在Swift中使用带nil参数的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(format: argumentArray:)方法来代替…)

在Swift中有正确的方法吗?

看起来好像(在当前的Xcode 6 beta 3版本中)一般都很困难在变量参数列表中传递nil

这个似乎起作用了:

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

但是最简单的解决方案是简单地将谓词写成

NSPredicate(format: "parentFolder == nil")

适合您的情况的最简单的解决方案是简单地将谓词写成:

NSPredicate(format: "parentFolder == nil")

但如果有必要插入nil作为参数,你可以使用NSNull。如果您正在使用可选

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

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

最新更新