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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:12:05