ValueCodable 是一个 Swift 库,用于以类型安全的方式解码未知结构的数据。
例如,假设你有一个包含以下内容的 yml 文件
name: foo
data:
obj:
a: 1
b: two
list:
- 1
- two
- foo: bar
其中 data
的格式事先未知。为任意数据结构编写解码器并非易事。
使用 ValueCodable
,解码非常简单
let s = """
name: foo
data:
obj:
a: 1
b: two
list:
- 1
- two
- foo: bar
"""
struct Test: Decodable {
let name: String
// capture the unstructure data as "Value"
let data: Value
}
let t = try YAMLDecoder().decode(Test.self, from: s)
// access "data" via subscript
print(t.data["obj"]) // Optional(["a": 1, "b": "two"])
print(t.data["list"]) // Optional([1, "two", ["foo": "bar"]])
print(t.data["list"]?[0]) // Optional(1)
// act on the decoded types
switch t.data["list"]?[2] {
case let .some(.dictionary(dict)):
print(dict) // ["foo": "bar"]
default:
print("unhandled type")
}
// access propertyies via key paths
print(t.data["obj.b"]) // Optional("two")
print(t.data["list[0]"]) // Optional(1)
print(t.data["list[2].foo"]) // Optional("bar")
Value
目前支持以下类型
public enum Value: Equatable {
case bool(Bool)
case int(Int)
case string(String)
case double(Double)
case dictionary([Key: Value])
case array([Value])
case null
}
在解码时,ValueCodable
将尝试解码为最合适的类型。