在 Swift 中使用 NSPredicate 时的 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】在 Swift 中使用 NSPredicate 时的 EXC_BAD_ACCESS【英文标题】:EXC_BAD_ACCESS when using NSPredicate in Swift 【发布时间】:2021-02-24 20:05:12 【问题描述】:

我正在尝试从 Core Data 中获取我的所有过敏原属性中没有“X”的项目。

func doesNotContain(attribute: String = "allergens", text: String) 
    let request: NSFetchRequest<Dinner> = Dinner.fetchRequest()
    let predicate = NSPredicate(format:"NOT \(attribute) CONTAINS %@", text)
    request.predicate = predicate
    do  items = try context.fetch(request) 
    catch let error  print("Error: \(error)") 

由于某种原因,这会因“EXC_BAD_ACCESS”而崩溃

但当我尝试使用以下方式获取谓词时,它工作得非常好:

func containsSearchWithNSPredicate(attribute: String, text: String) 
    let request: NSFetchRequest<Dinner> = Dinner.fetchRequest()
    let predicate = NSPredicate(format: "\(attribute) CONTAINS[cd] %@", text)
    request.predicate = predicate
    do  items = try context.fetch(request) 
    catch let error  print("Error: \(error)") 

这里的属性在函数调用时设置为“name”,在第一个例子中设置为“allergens”

我已经确定属性“allergens”不为零,并且我也尝试过使用 %d 而不是 %@。 allergens 属性是一个数组,这就是我使用 NOT CONTAINS 的原因

【问题讨论】:

@matt 不,但是 NSPredicate 应该与 NOT CONTAINS 以及 CONTAINS 一起使用,不是吗?第一个例子是 NOT CONTAINS 它是否可以使用额外的括号,如***.com/a/12535373/1187415 ? 如果allergens 属性是一个数组,那么谓词无论如何都不起作用(作为提取的一部分)。 NSPredicate(format: "\(attribute) CONTAINS[cd] %@", text) 应该是NSPredicate(format: "%K CONTAINS[cd] %@", attribute, text),这样更好。 如果attribute 是一个数组,不应该是"ANY attributes CONTAINS %@" 而不是工作吗?它不是 CoreData,但这就是为什么你的行为很奇怪:pastebin.com/p1iFFb0q 你应该使用ANY,除非你在attribute 上放了一些奇怪的值。 【参考方案1】:

事实证明 NSPredicate 不适用于标记为“可转换”且自定义类为 [String] 的属性。

我没有使用数组,而是将它变成了一个字符串,用“;”分隔每个单独的过敏原。以便以后可以分成子字符串。

过敏原示例:

dinner.allergens = "Gluten;Dairy"

NSPredicate:

let predicate = NSPredicate(format:"NOT (%K CONTAINS[cd] %@)",attribute, text)

获取请求现在将获取所有不具有包含文本的过敏原属性的实体

【讨论】:

以上是关于在 Swift 中使用 NSPredicate 时的 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

Swift NSPredicate SUBQUERY with NOT IN?

在 Swift 中使用 NSPredicate 对 CoreData 结果进行排序

CoreData NSPredicate

在 Swift 中使用 NSPredicate 时的 EXC_BAD_ACCESS

使用 NSPredicate 在单个搜索 iOS swift 中搜索多个单词

NSPredicate 'IN' 运算符在 swift 中的格式问题。无法解析格式字符串