【问题标题】:Can I use an NSPredicate in Swift with a nil argument?我可以在 Swift 中使用带有 nil 参数的 NSPredicate 吗?
【发布时间】:2014-09-01 06:43:12
【问题描述】:

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

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

目前,我在 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 :)方法...)

在 Swift 中有正确的方法吗?

【问题讨论】:

    标签: core-data swift nspredicate


    【解决方案1】:

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

    似乎有效:

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

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

    NSPredicate(format: "parentFolder == nil")
    

    【讨论】:

      【解决方案2】:

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

      NSPredicate(format: "parentFolder == nil")
      

      但是如果需要插入 nil 作为参数,你可以使用 NSNull。如果您使用 Optional,这可能很有用

      let folderName: String? = nil
      // ... assign folderName if available
      NSPredicate(format: "parentFolder == %@", folderName ?? NSNull())
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-19
        • 1970-01-01
        • 1970-01-01
        • 2016-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多