Swift – Codable

スポンサーリンク

Codable

Codable = Decodable + Encodable (Apple Documentation)

Codable supports Json <-> Model(Class, Struct) This is powerful to use API request and response handling

Sample1 – Simple Use

func parseJSONDecodable(str: String) -> UserModel? {
    var model: UserModel?
    do {
        model = try JSONDecoder().decode(UserModel.self, from: Data(str.utf8))
    } catch {
        print("Error: \(error.localizedDescription).")
    }
    return model
}

struct UserModel2 : Codable {
    let name: String
    let email: String
    let userId: String
    let type: Int
}

let jsonStr2 = """
{"name":"Taro", "email":"taro@taro.com", "userId":"xxxxxxx", "type":1}
"""

func parseJSONCodable(str: String) -> UserModel2? {
    var model: UserModel2?
    do {
        model = try JSONDecoder().decode(UserModel2.self, from: Data(str.utf8))
    } catch {
        print("Error: \(error.localizedDescription).")
    }
    return model
}

let model2 = parseJSONCodable(str: jsonStr)
if let model = model2 {
    print(model.email)
}

Sample 2 – Mapping key name

Some cases, model parameter name does not match API response key.

In this case, we can overwrap name using CodingKey

struct UserModel3 : Codable {
    let name: String
    let email: String
    let userId: String
    let type: Int
    
    enum CodingKeys: String, CodingKey {
        case userId = "user_id"
        case name
        case email
        case type
    }
}

let jsonStr3 = """
{"name":"Taro", "email":"taro@taro.com", "user_id":"xxxxxxx", "type":1}
"""

let model3 = try! JSONDecoder().decode(UserModel3.self, from: jsonStr3.data(using: .utf8)!)

iOS
スポンサーリンク
Professional Programmer2

コメント