我很难搞清楚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
?
之前有没有人遇到此错误?任何修复它的建议都表示赞赏。
答案 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)
}