【问题标题】:Is it possible to pass multiple data types inside a JsonDecoder?是否可以在 JsonDecoder 中传递多种数据类型?
【发布时间】:2021-11-16 14:06:20
【问题描述】:

这是我打算做的。

我有两个结构,StructAStructB

我还有一个 JsonDecoder 需要接受 StructAStructB

我尝试定义一个通用协议并使两个结构都符合该协议,并尝试使用 some 关键字,例如:

struct StructA: CommonStruct {
   let someBool = false
}

struct StructB: CommonStruct {
   let someString = "SomeString"
}

protocol CommonStruct {
}

func needToGetShitDone(
   data: CommonStruct  // <- What type should ``data`` be? 
) {
   let data = try JsonDecoder().decode(CommonStruct.type, from: data)
}

...当然,这没有用。

是否可以将 JsonDecoder 配置为同时接受 StructA 和 StructB。

【问题讨论】:

    标签: ios json swift protocols jsondecoder


    【解决方案1】:

    使协议符合Decodable并使用泛型函数

    protocol CommonStruct: Decodable {}
    
    
    func decode<T: CommonStruct>(from data: Data) throws -> T {
        try JSONDecoder().decode(T.self, from: data)
    }
    

    或者如果您的协议没有其他用途,那么您可以跳过它并执行

    func decode<T: Decodable>(from data: Data) throws -> T {
        try JSONDecoder().decode(T.self, from: data)
    }
    

    【讨论】:

    • 但是我应该如何调用这个函数并从中获取Decodable 对象呢?尝试 let structA: StructA = decode(data) 返回一个无法推断出通用模式 T
    • @PraantoSamadder 我不确定您对该函数做了哪些更改,但 let b: StructB = try decode(from: data) 对我来说适用于该函数的两个版本。
    • @PraantoSamadder 我的回答对您有帮助吗?如果是,请将其标记为已接受
    • 我对我的功能做了一些进一步的更改,它最终工作了。感谢您的帮助。
    猜你喜欢
    • 2013-12-16
    • 2012-10-18
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2021-04-03
    • 2011-01-16
    相关资源
    最近更新 更多