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

Swift 4中从JSON数组获取特定值时遇下标不可用错误求助

解决Quiz App中的下标访问错误

嘿,我来帮你搞定这个头疼的问题!你遇到的'subscript' is unavailable: cannot subscript String with an Int错误,说白了就是你不小心用整数下标去访问一个字符串类型的值了——就像你想从"hello"里拿第0个字符,但Swift里直接用"hello"[0]是不允许的,而你现在的代码里大概率是把本该是数组的变量当成字符串在用,或者解析JSON时把数组当成了字符串。

结合你给出的代码片段,我帮你梳理下问题点和解决方案:

首先,确认全局数组的类型

你说已经把数组设为全局变量,但从代码里只看到var r: Result?(单个Result对象),没看到数组变量。先确保你的全局数组是数组类型,而不是字符串或其他类型:

// 正确定义全局数组:存所有问答结果的数组
var quizResults: [Result] = []

如果你的全局变量不小心写成了String类型,那后续用下标访问肯定会报错。

检查JSON解析过程

你同时用了Decodable和SwiftyJSON,要注意不要混用解析逻辑,下面给你两种正确的解析方式:

方式1:Alamofire + Decodable(推荐)

直接用Alamofire的responseDecodable把返回的JSON数组转成[Result]:

AF.request("你的API接口地址").responseDecodable(of: [Result].self) { response in
    HUD.show(.progress)
    switch response.result {
    case .success(let results):
        HUD.flash(.success)
        // 把解析好的数组赋值给全局变量
        quizResults = results
        // 现在可以正常访问数组元素了!
        print("第一个问题:\(quizResults[0].question)")
    case .failure(let error):
        HUD.flash(.error)
        print("解析失败:\(error.localizedDescription)")
    }
}

方式2:Alamofire + SwiftyJSON

如果一定要用SwiftyJSON,要先确认返回的JSON是数组类型,再转成[Result]:

AF.request("你的API接口地址").responseJSON { response in
    HUD.show(.progress)
    switch response.result {
    case .success(let value):
        let json = JSON(value)
        // 先判断返回的是不是数组
        guard let jsonArray = json.array else {
            HUD.flash(.error)
            print("API返回的不是数组格式!")
            return
        }
        // 把JSON数组转成Result数组
        quizResults = jsonArray.compactMap { jsonObj in
            try? jsonObj.rawData().decoded(as: Result.self)
        }
        // 正常访问元素
        print("第一个正确答案:\(quizResults[0].correct_answer)")
        HUD.flash(.success)
    case .failure(let error):
        HUD.flash(.error)
        print("请求出错:\(error.localizedDescription)")
    }
}

排查常见错误点

  • 检查API返回的JSON格式:确保返回的是数组(比如[{"question":"xxx", "correct_answer":true}, ...]),如果API返回的是包含数组的对象(比如{"data": [{"question":"xxx", ...}]}),那你需要先解析到data字段再取数组。
  • 检查你访问元素的代码:比如是不是误写了someStringVariable[0],而这个变量本来应该是数组。

按照上面的步骤调整后,应该就能正常访问数组里的特定元素啦!

内容的提问来源于stack exchange,提问作者Anshul Shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:17:02