我有一个 Codable 类,其中包含一个包含 String 键和值的字典,这些值可能是 String s、Int s 或符合 Codable 的自定义结构。我的问题是:

如何定义值为 Codable 的字典?

我希望这足以说

var data: [String: Codable] = [:]

但显然这让我的类(class)不再符合 Codable 。我认为这里的问题与我在这里的问题相同,我传递的是协议(protocol)而不是协议(protocol)约束的对象



所以大概我需要一个受约束的泛型类型,比如 AnyObject<Codable> ,但这是不可能的。

编辑:回答

因此,由于无法按照公认的答案进行操作,因此我将使用带有每种数据类型的字典的结构
struct CodableData {
    var ints: [String: Int]
    var strings: [String: String]
    //...

    init() {
       ints = [:]
       strings = [:]
    }
}

var data = CodableData()

最佳答案

一个 Swift 集合只包含一种类型,要使其成为 Codable,该类型需要是 Codable——不是 Codable 类型,而是 Codable 协议(protocol)的采用者。您需要这里的类型是某个特定的 Codable 采用者。

因此,执行您所描述的操作的唯一方法基本上是发明一些新类型 StringOrIntOrStruct,它包装 String 或 Int 或结构,并且本身采用 Codable。

但我不认为你正在这样做,因为努力似乎不值得。基本上,您应该首先停止尝试使用异构 Swift 集合;这完全违背了语言的精神。从一开始就是一种难闻的气味。重新考虑你的目标。

关于ios - Swift 4 Codable 对象集合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45734612/

10-10 09:24