Swift:如何将字典数组转换为结构?

时间:2019-12-03 14:35:02

标签: swift

我有:

array = [["name": String, "lastName": String],
         ["name": String, "lastName": String], 
         ["name": String, "lastName": String]]  

(a: [Сlass.[String:String]]) -> [Class.SomeStruct] {}

如何通过此数组构造具有其属性的结构? 像这样:

struct SomeStruct {
    let name: String
    let lastName: String
}

2 个答案:

答案 0 :(得分:0)

您可以使用mapcompactMap将字典转换为结构。

let array = [["name": "String", "lastName": "String"],
["name": "String", "lastName": "String"],
["name": "String", "lastName": "String"]]

struct SomeStruct {
    let name: String
    let lastName: String
}


let values = array.compactMap { data -> SomeStruct? in
    guard let name = data["name"], let lastName = data["lastName"] else {
        return nil
    }
    return SomeStruct(name: name, lastName: lastName)
}

注意:compactMap将无提示地忽略所有不包含namelastName键的字典。

答案 1 :(得分:-1)

使用可编码

// MARK: - SomeStructElement
struct SomeStructElement: Codable, Equatable {
    let name: Int?
    let lastName: String?

    enum CodingKeys: String, CodingKey {
        case name = "name"
        case lastName = "lastName"
    }
}

然后使用JSONDecoder:

let someStructArray: Array<SomeStructElement> = try? JSONDecoder().decode(Array<SomeStructElement>.self, from: data) ?? []


来源:Encoding and Decoding Custom Types (Apple developer)