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)!)
コメント