さまよえる、Android

Androidのプログラミングで便利なことや残しておきたいことを残しておく。もしオススメのライブラリがあったら教えてくださいね。

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")