在Swift数组上使用过滤器使得#34;无法使用类型(对象)抛出的参数列表调用过滤器 - > BOOL,"但是这个论点并没有抛出

时间:2016-12-07 17:44:46

标签: ios swift

我很难搞清楚Swift在这里期待什么样的参数列表,因为我在调用" filter"时遇到了错误。在快速阵列上。

这是我的代码:

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,一本书的标题是一个简单的String属性 - 一个@NSManaged var。这里的标题没有什么特别之处,也没有任何迹象表明检查标题会抛出。但是,我在过滤器行上收到错误消息:

&#34;无法调用&#39;过滤&#39;使用类型&#39;((Book)throws - &gt; Bool)的参数列表&#39;

显然,我错过了一些东西,因为这种比较对我来说并不像它会抛出的那样。我已经尝试了其他两种方法来做到这一点,并且我一直遇到同样的错误。

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

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

设置谓词来做同样的事情也不会有任何帮助:

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

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

任何人都知道为什么swift认为这里的论点是(Book) throws -> Bool而不只是(Book) -> Bool

之前有没有人遇到此错误?任何修复它的建议都表示赞赏。

1 个答案:

答案 0 :(得分:6)

错误消息可能会产生误导。 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)
}