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

如何创建包含不同Encodable类型值的字典?

如何让Swift字典支持多种遵循Encodable的类型作为值传递给函数?

你的问题出在泛型参数T的约束上:原函数要求字典中所有值必须是同一类型的T(且遵循Encodable),但当你传入混合类型(比如Int和Location)时,编译器无法找到一个同时满足两种类型的T,因此编译失败。

要实现支持多种Encodable类型的字典,最简单的方案是直接将字典类型改为[String: Encodable],去掉泛型约束:

func getResource(_ params: [String: Encodable]) {
    // 函数实现逻辑
}

完整示例代码

import Foundation

struct Location: Codable {
    static let zero = Location(latitude: 0, longitude: 0)
    let latitude: Double
    let longitude: Double
}

func getResource(_ params: [String: Encodable]) {
    let encoder = JSONEncoder()
    encoder.outputFormatting = .prettyPrinted
    
    do {
        let data = try encoder.encode(params)
        if let jsonString = String(data: data, encoding: .utf8) {
            print("编码结果:\n\(jsonString)")
        }
    } catch {
        print("编码失败:\(error.localizedDescription)")
    }
}

// 调用混合类型字典
getResource(["number": 1, "otherLocation": Location.zero])

为什么这个方案可行?

Encodable是Swift的协议,[String: Encodable]表示字典的值可以是任意遵循Encodable协议的类型,不管是基础类型(Int、String等)还是自定义的Codable结构体(比如Location),都能被正确识别和处理。

如果你的函数内部需要对参数进行JSON编码,JSONEncoder原生支持对[String: Encodable]类型的编码,不需要额外处理。


内容的提问来源于stack exchange,提问作者Aziz A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:21:27