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
相关产品推荐
相关产品推荐

