在 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 结果进行排序
在 Swift 中使用 NSPredicate 时的 EXC_BAD_ACCESS