从Core Data检索[String]类型Transformable属性时崩溃问题求助
问题分析与修复
你的检索代码里有几个明显错误,直接导致了索引越界崩溃:
空数组直接赋值索引0
你初始化的retrievedResults是空数组,却直接执行retrievedResults[0] = ...——空数组里根本没有索引为0的元素,这肯定会触发索引越界错误。应该用append方法添加元素,而不是直接给不存在的索引赋值。可选类型处理不当
data.value(forKey: "results") as? [String]得到的是可选类型[String]?,直接用String(describing: results)会把可选值的描述(比如Optional(["xxx"]))存进去,这不是你要的原始数组内容。得先安全解包这个可选值。Fetch请求的类型与错误处理不严谨
用NSFetchRequest<NSFetchRequestResult>然后强制转[NSManagedObject]不安全,直接指定NSFetchRequest<NSManagedObject>更稳妥;另外try?会吞掉fetch的错误,建议用do-catch捕获错误,方便排查问题。
修复后的代码
func getResultsObjects() -> [String] { var retrievedResults = [String]() let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "ResultsObjects") do { let result = try privateContext.fetch(fetchRequest) for data in result { // 安全解包可选的数组 if let results = data.value(forKey: "results") as? [String] { // 两种选择: // 1. 把整个数组的内容用分隔符连接成一个字符串添加 // retrievedResults.append(results.joined(separator: "\n")) // 2. 把数组里的每个元素单独添加到结果数组 retrievedResults.append(contentsOf: results) } } } catch { print("从CoreData读取失败!错误信息:\(error)") } return retrievedResults }
额外说明
- 如果你想把每个
ResultsObjects实体里的results数组整体作为一个元素存入返回数组,那需要把函数返回类型改成[[String]],然后直接retrievedResults.append(results)。 - 永远不要对空数组直接赋值索引位置,必须确保数组有足够元素,或者用
append/append(contentsOf:)来添加新内容。
内容的提问来源于stack exchange,提问作者Jessica Kimble
相关产品推荐
相关产品推荐

