使用Codable(Swift)从Json文件解析UIColor

Ric*_*sta 5 iphone json ios swift codable

我试图解码一个json文件,并且我在那里有很多ui配置,我正在寻找一个干净的解决方案以直接将十六进制代码解析为UIColor。但是UIColor不符合Codable。

例如这个json:

var json = """
{
    "color": "#ffb80c"
}
""".data(using: .utf8)!
Run Code Online (Sandbox Code Playgroud)

我希望能够做到这一点:

struct Settings: Decodable {
    var color: UIColor
}
Run Code Online (Sandbox Code Playgroud)

并且即时解码时将“ hex”字符串转换为UIColor

我已经有了此函数来从String解码并返回UIColor:

public extension KeyedDecodingContainer {

    public func decode(_ type: UIColor.Type, forKey key: Key) throws -> UIColor {

        let colorHexString = try self.decode(String.self, forKey: key)
        let color = UIColor(hexString: colorHexString)

        return color
    }
}
Run Code Online (Sandbox Code Playgroud)

为此,我需要通过获取容器并对其进行解码来对其进行手动解码,但是由于我有很多配置,因此我的课程非常庞大,因为我需要设置所有内容:

struct Settings: Decodable {

    var color: Color

    enum CodingKeys: CodingKey {

        case color
    }

   init(from decoder: Decoder) throws {

        let container = try decoder.container(keyedBy: CodingKeys.self)

        color = try container.decode(UIColor.self, forKey: .color)
   }
}
Run Code Online (Sandbox Code Playgroud)

最后,即时通讯正在寻找一种更清洁的方式来执行此操作。理想的方法是将UIColor设置为可编码(但我认为我无法做到这一点)

提前致谢

Ced*_*ith -1

如果您正在寻找可以将 RGB 十六进制代码转换为 UIColor 的函数,请使用它。

func hexStringToUIColor (hex:String) -> UIColor {
    var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
    if (cString.hasPrefix("#")) {
        cString.remove(at: cString.startIndex)
    }
    if ((cString.count) != 6) {
        return UIColor.gray
    }
    var rgbValue:UInt32 = 0
    Scanner(string: cString).scanHexInt32(&rgbValue)
    return UIColor(
        red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
        green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
        blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
        alpha: CGFloat(1.0)
    )
}
Run Code Online (Sandbox Code Playgroud)

用法:

let color = hexStringToUIColor (hex: ""#ffb80c")
Run Code Online (Sandbox Code Playgroud)

这将返回十六进制代码的 UIColor"#ffb80c"

  • 感谢您的回复,但我不是在寻找这个,正如我所说,我正在寻找一种使用十六进制代码从 json 解码 UIColor 的方法 (2认同)