NSPredicate抛出EXC_BAD_ACCESS

时间:2016-10-07 22:12:17

标签: ios swift3 nspredicate

我试图删除用户选择的图书,并且我在NSPredicate线上获得了EXC_BAD_ACCESS。谁能告诉我我哪里做错了?

 func deleteSelectedBook() {
    // Create Fetch Request
    let fetchRequest = NSFetchRequest(entityName: "BookEntity")

    // Create array string for predicate
    var titleCollection:[String] = []
    var formatString:String = ""
    if let selectedCellCollection = self.tableView.indexPathsForSelectedRows {
        for index in selectedCellCollection{
            if (!formatString.isEmpty) {
                formatString += " OR "
            }
            var temp = (self.tableView.cellForRowAtIndexPath(index)?.textLabel?.text)!
            titleCollection.append(temp)
            formatString += " title = %@ "
        }
    }

    // Configure Fetch Request
    fetchRequest.predicate = NSPredicate(format: formatString, titleCollection)

 ......

1 个答案:

答案 0 :(得分:1)

对于两个(作为示例)所选项目,formatString将是

"title = %@ OR title = %@"

需要两个参数,但在

NSPredicate(format: formatString, titleCollection)

只给出了一个参数。您可以使用

修复此问题
NSPredicate(format: formatString, argumentArray: titleCollection)

其中titleCollection现在提供了所有参数 谓词创造。但是更好更简单的解决方案是

NSPredicate(format: "title IN %@", titleCollection)

使用固定的谓词格式字符串。

通常应该避免使用字符串操作来创建 谓词格式字符串。在这种情况下,一个简单的谓词服务 同样的目的。在更复杂的情况下,NSCompoundPredicate 可用于动态构建谓词。