Swift 4:如何访问服务器响应字典中的数组值?
解决Swift 4中获取服务器响应数组的问题
嘿,我来帮你搞定这个问题!从你给出的print输出能看出来,你拿到的result["top10"]其实是一个Objective-C风格的字典结构(因为服务器返回的JSON用Foundation框架解析后,有时候会变成NSDictionary/NSArray这类OC集合,打印出来就是这种带括号和键值对的格式)。要拿到里面的完整数组,你可以按下面的步骤来:
方法一:直接类型转换(快速简单)
首先,top10对应的值是一个字典,里面的item键才是你要的数组。我们只需要把它转换成Swift的字典和数组类型就行:
// 假设result是服务器返回的[AnyHashable: Any]类型字典 if let top10Dict = result["top10"] as? [String: Any], let itemsArray = top10Dict["item"] as? [[String: Any]] { // 这里的itemsArray就是你要的完整数组啦 print("拿到的数组:", itemsArray) // 要是想遍历数组里的元素,直接循环就行 for vehicle in itemsArray { let brand = vehicle["vehicle_brand"] as? String ?? "未知品牌" let count = vehicle["count"] as? Int ?? 0 print("\(brand) 的数量:\(count)") } }
方法二:用Codable解析(更安全优雅)
Swift 4开始推荐用Codable协议来做JSON解析,强类型的方式能避免很多类型转换的错误,也更易维护:
// 先定义对应数据结构的模型 struct VehicleStats: Codable { let count: Int let engineSize: String let fuelType: String let vehicleBrand: String let vehicleType: String // 因为服务器返回的键是带下划线的,这里做个映射 enum CodingKeys: String, CodingKey { case count case engineSize = "engine_size" case fuelType = "fuel_type" case vehicleBrand = "vehicle_brand" case vehicleType = "vehicle_type" } } struct Top10Container: Codable { let item: [VehicleStats] } // 然后进行解析 if let top10Object = result["top10"], let top10Data = try? JSONSerialization.data(withJSONObject: top10Object), let top10Container = try? JSONDecoder().decode(Top10Container.self, from: top10Data) { let itemsArray = top10Container.item // 这里的itemsArray是[VehicleStats]类型,直接用属性访问就行,不用再强制转换 for vehicle in itemsArray { print("\(vehicle.vehicleBrand) \(vehicle.vehicleType):\(vehicle.count)辆") } }
小提示
你看到的那种奇怪的打印格式,是因为Swift打印OC集合(比如NSDictionary)时会用OC的描述方式,本质还是字典嵌套数组的结构,只要找准层级、做好类型转换就能轻松拿到数据啦~
内容的提问来源于stack exchange,提问作者Christian




