我有一个 Codable
带有一个变量的类,该变量包含 String
的字典键和值可能是 String
小号,Int
s 或符合 Codable
的自定义结构.我的问题是:
如何定义值为 Codable
的字典?
我希望这就足够了
var data: [String: Codable] = [:]
但显然这使我的类不再符合 Codable
.我认为这里的问题和我这里的一样,我传递的是协议(protocol)而不是受协议(protocol)约束的对象
Using JSON Encoder to encode a variable with Codable as type
所以大概我需要一个受约束的通用类型,比如 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 - Codable 对象的 Swift 4 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45734612/