Swift 4可编码阵列

Cha*_*ish 15 swift swift4 codable

所以我有一个返回JSON对象数组的API路由.例如:

[
    {"firstname": "Tom", "lastname": "Smith", "age": 31},
    {"firstname": "Bob", "lastname": "Smith", "age": 28}
]
Run Code Online (Sandbox Code Playgroud)

我试图想象如何在Swift中使用新的可编码特性将它们转换为类中的两个对象.因此,如果我有一个可编码的人类,我会想要采取这种反应并让它给我两个人物.

我也在使用Alamofire来处理这些请求.

我怎样才能做到这一点?到目前为止,我所看到的与可编码内容有关的所有内容只允许1个对象.我还没有看到任何与Alamofire或Web框架的集成.

nat*_*han 17

关于Alamofire 5的更新:responseJSONDecodable.

struct Person: Codable {
    let firstName, lastName: String
    let age: Int

    enum CodingKeys : String, CodingKey {
        case firstName = "firstname"
        case lastName = "lastname"
        case age
    }
}

Alamofire.request(request).responseJSONDecodable { (response: DataResponse<Person>) in
    print(response)
}
Run Code Online (Sandbox Code Playgroud)

Alamofire 4现在不会添加Codable支持(参见#2177),您可以使用此扩展名:https://github.com/Otbivnoe/CodableAlamofire.

let jsonData = """
[
    {"firstname": "Tom", "lastname": "Smith", "age": 31},
    {"firstname": "Bob", "lastname": "Smith", "age": 28}
]
""".data(using: .utf8)!

struct Person: Codable {
    let firstName, lastName: String
    let age: Int

    enum CodingKeys : String, CodingKey {
        case firstName = "firstname"
        case lastName = "lastname"
        case age
    }
}

let decoded = try! JSONDecoder().decode([Person].self, from: jsonData)
Run Code Online (Sandbox Code Playgroud)

示例:http://swift.sandbox.bluemix.net/#/repl/59a4b4fad129044611590820

使用CodableAlamofire:

let decoder = JSONDecoder()
Alamofire.request(url).responseDecodableObject(keyPath: nil, decoder: decoder) { (response: DataResponse<[Person]>) in
    let persons = response.result.value
    print(persons)
}
Run Code Online (Sandbox Code Playgroud)

keypath对应于结果包含在JSON结构中的路径.例如:

{
    "result": {
        "persons": [
            {"firstname": "Tom", "lastname": "Smith", "age": 31},
            {"firstname": "Bob", "lastname": "Smith", "age": 28}
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

keypath => results.persons

[
    {"firstname": "Tom", "lastname": "Smith", "age": 31},
    {"firstname": "Bob", "lastname": "Smith", "age": 28}
]
Run Code Online (Sandbox Code Playgroud)

keypath=> nil(空keypath抛出异常)