Swift中类转[Any]用于JSONSerialization及Shinobicontrols数据源配置问题
解决Swift类转[Any]适配JSONSerialization的问题
看你现在在用Swift结合Shinobicontrols做开发,还在处理自定义类作为数据源的逻辑,先把你贴的代码整理一下方便查看:
getLandGradingData(community: (pickOption?[pickerView.selectedRow(inComponent: 0)])!) { result in self.helper?.data = result } func getLandGradingData(community:String, completionHandler:@escaping (_ result:Array<GradingData>) -> Void) { var returnedResults = Array<GradingData>() WebService().GetLandGradingData(community) { (result: Array<GradingData>) in DispatchQueue.main.async { // 这里应该是把结果通过completion返回的逻辑,比如completionHandler(result) } } }
关于你问的如何把Swift类转换成[Any]类型来适配JSONSerialization.jsonObject方法,其实核心是JSONSerialization只能处理Foundation原生类型(比如String、Int、Dictionary、Array这些),自定义类必须先转成这些基础类型的组合,才能被它识别。下面给你两种实用的方案:
方案1:给自定义类添加转字典方法
这是最直接的方式,给你的GradingData类加一个方法,把实例的属性映射成[String: Any]字典,然后把整个数组转成字典数组(也就是[Any]的一种)。
举个例子,假设你的GradingData有这些属性:
class GradingData { var id: Int var communityName: String var gradingScore: Double init(id: Int, communityName: String, gradingScore: Double) { self.id = id self.communityName = communityName self.gradingScore = gradingScore } // 新增转字典的方法 func toDictionary() -> [String: Any] { return [ "id": id, "communityName": communityName, "gradingScore": gradingScore ] } }
然后转换数组就很简单了:
// 把[GradingData]转成[Any] let gradingDataArray: [GradingData] = // 你的数据源数组 let anyArray: [Any] = gradingDataArray.map { $0.toDictionary() }
这样得到的anyArray就可以直接给JSONSerialization.jsonObject相关逻辑用了。
方案2:用Codable协议(更现代的Swift方式)
如果你的类已经遵循了Codable(毕竟现在网络请求数据很多用这个解析),可以先把对象序列化成Data,再转成JSON对象数组:
// 先让GradingData遵循Codable extension GradingData: Codable { // 如果属性名和JSON键名完全一致,不需要额外写CodingKeys;如果不一样,要自定义CodingKeys枚举 } // 转换方法 func convertGradingDataToAnyArray(_ dataArray: [GradingData]) throws -> [Any] { // 先把数组转成Data let jsonData = try JSONEncoder().encode(dataArray) // 再转成JSON对象,也就是[Any]类型 guard let anyArray = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [Any] else { throw NSError(domain: "ConversionError", code: 0, userInfo: [NSLocalizedDescriptionKey: "无法将GradingData数组转换为[Any]"]) } return anyArray }
小提醒
如果你的GradingData里还有嵌套的自定义对象,那嵌套的对象也需要做同样的处理——要么加转字典方法,要么也遵循Codable,不然转换的时候会报错哦。
内容的提问来源于stack exchange,提问作者user979331
相关产品推荐
相关产品推荐

