SwiftのCodableでEnumを変換する
import UIKit enum Country: Int, Codable { case japan = 0 case usa case france } struct Member: Codable { let id: Int let country: Country } let json = """ { "id": 1, "country": 0 } """ let decoded = try JSONDecoder().decode(Member.self, from: json.data(using: .utf8)!) let country = decoded.country switch country { case .japan: print("日本") case .usa: print("アメリカ") case .france: print("フランス") } print(decoded.country)
Swiftで文字列のJSONをStructのインスタンスに変換する。
import UIKit protocol Json : Codable { func json(key: String) -> String! var json:String! { get } } extension Json { func json(key: String) -> String! { let encoder = JSONEncoder() encoder.dateEncodingStrategy = .iso8601 encoder.outputFormatting = .prettyPrinted guard let data = try? encoder.encode([key : self]) else { return nil } return String(data: data, encoding: .utf8)! } } extension Json { var json: String! { let encoder = JSONEncoder() encoder.dateEncodingStrategy = .iso8601 encoder.outputFormatting = .prettyPrinted guard let data = try? encoder.encode(self) else { return nil } return String(data: data, encoding: .utf8)! } } struct User: Json { let name: String let age: Int } struct Admin: Json { let user: User let permission: Int } let user = User(name: "田中", age: 9) let admin = Admin(user: user, permission: 5) var decoder = JSONDecoder() extension String { func decode<T: Decodable>() -> T { return try! decoder.decode(T.self, from: self.data(using: .utf8)!) } } if let json = user.json { let user: User = json.decode() print(user.name) print(user.age) }
構造体にjsonメソッドとjsonプロパティを拡張すると便利????
import UIKit protocol Json : Codable { func json(key: String) -> String! var json:String! { get } } extension Json { func json(key: String) -> String! { let encoder = JSONEncoder() encoder.dateEncodingStrategy = .iso8601 encoder.outputFormatting = .prettyPrinted guard let data = try? encoder.encode([key : self]) else { return nil } return String(data: data, encoding: .utf8)! } } extension Json { var json: String! { let encoder = JSONEncoder() encoder.dateEncodingStrategy = .iso8601 encoder.outputFormatting = .prettyPrinted guard let data = try? encoder.encode(self) else { return nil } return String(data: data, encoding: .utf8)! } } struct User: Json { let name: String let age: Int } struct Admin: Json { let user: User let permission: Int } let user = User(name: "田中", age: 9) let admin = Admin(user: user, permission: 5) print(admin.json(key: "top") ?? "失敗") print(admin.json ?? "top")