我有一个 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/