Xcode 9.3中Swift初始化NSPredicate时崩溃问题求助
解决Core Data唯一性检查中NSCompoundPredicate初始化崩溃的问题
兄弟,我看你这个问题大概率是自己代码里的小疏漏,不是Xcode 9.3的bug哈!你直接用var predicate = NSCompoundPredicate()这种无参初始化的方式本身就有问题——NSCompoundPredicate是需要明确的逻辑类型(AND/OR)和子谓词数组才能正常工作的,空初始化会导致它内部状态异常,自然就崩溃了。
问题根源
NSCompoundPredicate的无参init()是继承自NSObject的默认初始化方法,但它本身的设计是必须依赖子谓词和逻辑关系才能构建有效的谓词。空初始化出来的实例没有任何有效内容,后续使用时必然会触发崩溃。
修复方案
你应该先构建好需要检查唯一性的字段对应的子谓词,再用专门的初始化方法创建复合谓词。比如假设你要检查material和shape两个字段的组合唯一性,代码可以改成这样:
func parachuteUnique(parachute: ParachuteData) -> Bool { let material = parachute.material.rawValue let shape = parachute.shape.rawValue // 补全你代码里的shape字段逻辑 // 先收集所有需要检查的子谓词 var subPredicates = [NSPredicate]() subPredicates.append(NSPredicate(format: "material == %@", material)) subPredicates.append(NSPredicate(format: "shape == %@", shape)) // 可以继续添加其他需要检查唯一性的字段谓词 // 用AND逻辑创建复合谓词(表示所有字段都匹配才判定为重复) let predicate = NSCompoundPredicate(andPredicateWithSubpredicates: subPredicates) // 后续执行Core Data查询,判断是否存在重复条目 let fetchRequest: NSFetchRequest<ParachuteData> = ParachuteData.fetchRequest() fetchRequest.predicate = predicate do { // 这里替换成你自己的Core Data上下文 let duplicateCount = try yourManagedObjectContext.count(for: fetchRequest) return duplicateCount == 0 // 返回true表示没有重复,false表示已存在 } catch { print("检查降落伞唯一性失败:\(error.localizedDescription)") return false } }
额外建议
- 如果你是要做组合字段唯一,除了代码层面检查,还可以直接在Core Data模型文件里给对应的字段设置唯一约束——这样数据库层面会直接拦截重复数据,比代码检查更可靠。
- 注意Core Data上下文的线程安全,确保你在正确的线程上执行查询操作。
内容的提问来源于stack exchange,提问作者Yrb
相关产品推荐
相关产品推荐

