ValueCodable

Build Status

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 将尝试解码为最合适的类型。