我正在尝试将使用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中有没有正确的方法?
答案 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,则将获取所有没有父文件夹的文件夹。