是否可以实现Encodable
和的Decodable
属性UIColor
当我尝试添加Decodable
扩展名时出现错误
extension UIColor : Decodable {
public required init(from decoder: Decoder) throws {
self.init(red: 1, green: 1, blue: 1, alpha: 1)
}
}
错误:ColorStuff.playground:98:21:错误:初始化程序要求’init(from
:)’只能由required
初始化程序在非最终类’UIColor’的定义中满足public必需init(from解码器:Decoder)抛出{
我在这里错过明显的东西吗?
Encodable
扩展名没有问题-似乎是个Decodable
问题。
该错误消息向我暗示由于无法访问UIColor
类定义而无法执行此操作
由于编译器给出的错误,您不能使扩展UIColor
符合Decodable
。
一种解决方案是创建Codable
包装器类型,然后使用它。
由于UIColor
已经符合NSCoding
,我们只需要编写一个通用类型,就可以对符合的任何内容进行编码和解码NSCoding
。
import UIKit
struct WrapperOfNSCoding<Wrapped>: Codable where Wrapped: NSCoding {
var wrapped: Wrapped
init(_ wrapped: Wrapped) { self.wrapped = wrapped }
init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
let data = try container.decode(Data.self)
guard let object = NSKeyedUnarchiver.unarchiveObject(with: data) else {
throw DecodingError.dataCorruptedError(in: container, debugDescription: "failed to unarchive an object")
}
guard let wrapped = object as? Wrapped else {
throw DecodingError.typeMismatch(Wrapped.self, DecodingError.Context(codingPath: container.codingPath, debugDescription: "unarchived object type was \(type(of: object))"))
}
self.wrapped = wrapped
}
func encode(to encoder: Encoder) throws {
let data = NSKeyedArchiver.archivedData(withRootObject: wrapped)
var container = try encoder.singleValueContainer()
try container.encode(data)
}
}
let colors = [UIColor.red, UIColor.brown]
print(colors)
let jsonData = try! JSONEncoder().encode(colors.map({ WrapperOfNSCoding($0) }))
let colors2 = try! JSONDecoder().decode([WrapperOfNSCoding<UIColor>].self, from: jsonData).map({ $0.wrapped })
print(colors2)
UIColor-HBVHarmonies提供各种有趣的颜色方案。可以随意混色,获取随机颜色等。
UIColor+Additions 是 UIColor 类,帮助开发者简化颜色操作,更灵活。 UIColor+Additions 附加是一个类别的UIColor,可以帮助开发者进行色彩操控更加灵活和方便。 十六进制颜色表示 使用便捷方法从十六进制整数或字符串值创建颜色: + (UIColor*)add_colorWithRGBHexValue:(ADDColorType)rgbHexValue;+
ChineseTraditionalColors 是一个中国传统颜色选择器,是 UIColor 的 Swift 扩展。
UIColor+HBVHarmonies 是基于块的 UIColor 类,可以创建非常漂亮和谐的颜色。
UIColor-CSSColors 扩展了 UIColor 实现了 CSS 风格的颜色写法。
UIColor+FlatColors 是 UIColor 的分类,实现了来自 Flat UI framework 的扁平化设计风格的色彩效果。