【问题标题】:Using filter on Swift Array gives "cannot invoke filter with an argument list of type (Object) throws -> Bool," but the argument doesn't throw在 Swift Array 上使用过滤器会给出“无法使用类型为 (Object) throws -> Bool 的参数列表调用过滤器”,但参数不会抛出
【发布时间】:2017-04-22 18:47:49
【问题描述】:

我无法准确确定 Swift 在这里期望什么样的参数列表,因为当我在 swift 数组上调用“过滤器”时出现错误。

这是我的代码:

func setDefaultBook()
{
    var book: Book

    let fetchRequest: NSFetchRequest<Book> = Book.fetchRequest()
    if let fetchResults = try? managedObjectContext.fetch(fetchRequest) {
        book = fetchResults.filter { $0.title == defaultBookTitle }
    }

    ...
}

一本书是一个NSManagedObject,一本书的标题是一个简单的字符串属性——一个@NSManaged var。这里的标题没有什么特别之处,也没有任何迹象表明检查标题会抛出异常。但是,我在过滤器行上收到一条错误消息:

"不能使用类型为'((Book) throws -> Bool)'的参数列表调用'filter'

很明显,我遗漏了一些东西,因为在我看来,这种比较不像它会抛出的那样。我已经尝试了其他几种方法,但我一直收到同样的错误。

像这样构建闭包并没有帮助:

book = fetchResults.filter { book in
    book.title == defaultBookTitle
}

设置谓词来做同样的事情也无济于事:

let predicate: (Book) -> Bool = { $0.title == self.defaultBookTitle }
book = fetchResults.filter(predicate)

我一直收到和以前一样的错误。

任何人都知道为什么 swift 认为这里的参数是(Book) throws -&gt; Bool 而不仅仅是(Book) -&gt; Bool

以前有没有人遇到过这个错误?任何修复它的建议表示赞赏。

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    错误消息可能具有误导性。 filter 的结果总是一个数组

    var books = [Book]()
    
    let fetchRequest: NSFetchRequest<Book> = Book.fetchRequest()
    if let fetchResults = try? managedObjectContext.fetch(fetchRequest) {
        books = fetchResults.filter { $0.title == defaultBookTitle }
    }
    

    但为什么不让 Core Data 过滤记录:

    var books = [Book]()
    
    let fetchRequest: NSFetchRequest<Book> = Book.fetchRequest()
    fetchRequest.predicate = NSPredicate(format:"title = %@", defaultBookTitle)
    do {
       books = try managedObjectContext.fetch(fetchRequest)
    } catch {
      print(error)
    }
    

    【讨论】:

    • 这两方面的答案都很好。一些后续行动:file bugs 如果您看到需要改进的编译器消息。让 Core Data 像这样进行过滤总是更好,因为在数据库中搜索/过滤比在获取/实例化的对象上执行要便宜得多。
    • 您是正确的,因为这是一个误导性的错误消息;不幸的是,我专注于那个而不是实际的回报是什么。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多