CodeAny 0.2.0

CodeAny 0.2.0

ztgtut维护。



CodeAny 0.2.0

  • 通过
  • zhtg

CodeAny

用于 Swift Codable 支持泛型类型,对于数组中,返回类型不确定时非常有用

例如飞书的节点中有一个字段是 interface 的,可能是字典,也可能是数组,而且这个节点中的数组使用 Swift 的 Codable 处理起来不太方便

[{
    "field_alias": "owner",
    "field_key": "owner",
    "field_type_key": "user",
    "field_value": interface{}
}]

用法

Swift 包管理器

.package(name: "CodeAny", url: "https://github.com/zhtut/CodeAny.git", from: "0.1.0")

CocoaPods

pod 'CodeAny'
struct Person: Codable {
    var name: String
    @AnyType // 在不确定的类型属性,加上一个包装
    var like: Any
}

解析方法还是一样

let jsons = [
            [
                "name": "张三",
                "like": "吃饭",
                "company": "apple"
            ],
            [
                "name": "李四",
                "like": 5,
                "company": "google"
            ],
            [
                "name": "王五",
                "like": 15.5,
                "age": 18
            ],
            [
                "name": "赵六",
                "like": [5]
            ],
            [
                "name": "孙七",
                "like": ["test": true]
            ],
            [
                "name": "刘八",
                "like": "<null>"
            ]
        ]
        
        let data = try JSONSerialization.data(withJSONObject: jsons)
        let persons = try JSONDecoder().decode([Person].self, from: data)
        print("解析成功:\(persons)")
        print("他们喜欢的东西:\(persons.map({$0.like}))")
        
        let three = persons[3]
        // 使用该属性时候再判断一下类型
        if let like = three.like as? [Int] {
            print("赵六喜欢的:\(like)")
        }
        let four = persons[4]
        // 使用该属性的时候再判断一下类型
        if let like = four.like as? [String: Any] {
            print("孙七喜欢的:\(like)")
        }
        
        let jsonData = try JSONEncoder().encode(persons)
        let string = String(data: jsonData, encoding: .utf8)
        print("转换回json:\(string ?? "")")

暂不支持 optional