You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Core Data检索[String]类型Transformable属性时崩溃问题求助

问题分析与修复

你的检索代码里有几个明显错误,直接导致了索引越界崩溃:

  1. 空数组直接赋值索引0
    你初始化的retrievedResults是空数组,却直接执行retrievedResults[0] = ...——空数组里根本没有索引为0的元素,这肯定会触发索引越界错误。应该用append方法添加元素,而不是直接给不存在的索引赋值。

  2. 可选类型处理不当
    data.value(forKey: "results") as? [String]得到的是可选类型[String]?,直接用String(describing: results)会把可选值的描述(比如Optional(["xxx"]))存进去,这不是你要的原始数组内容。得先安全解包这个可选值。

  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 00:20:23