温馨提示:本文翻译自stackoverflow.com,查看原文请点击:swift4 - Swift 4 Codable Array's
swift swift4 codable

swift4 - Swift 4可编码阵列

发布于 2020-03-28 23:39:35

所以我有一个API路由,该路由返回一个JSON对象数组。例如:

[
    {"firstname": "Tom", "lastname": "Smith", "age": 31},
    {"firstname": "Bob", "lastname": "Smith", "age": 28}
]

我正在尝试设想如何使用Swift中的新可编码功能将它们转换为类中的两个对象。因此,如果我有一个可编码的人员类,我想接受该响应并将它给我两个人对象。

我还使用Alamofire处理请求。

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

查看更多

查看更多

提问者
Charlie Fish
被浏览
15
nathan 2018-05-31 03:00

有关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)
}

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)

样本: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)
}

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

{
    "result": {
        "persons": [
            {"firstname": "Tom", "lastname": "Smith", "age": 31},
            {"firstname": "Bob", "lastname": "Smith", "age": 28}
        ]
    }
}

keypath => results.persons

[
    {"firstname": "Tom", "lastname": "Smith", "age": 31},
    {"firstname": "Bob", "lastname": "Smith", "age": 28}
]

keypath=> nil(空keypath引发异常)