利用 Swift 5.1 中包含的 Swift 属性包装器来解码 UIColor 和 UIImage (UIKit) 以及 NSColor 和 NSImage (AppKit)
此版本仅支持 Swift Package Manager。 我没有计划支持其他包管理器,例如 CocoaPods 或 Carthage。
将以下行添加到现有的 Packages.swift
文件中
dependencies: [
.package(url: "https://github.com/Denis5161/CodableValue.git", from: "6.0.1")
]
或者使用 Xcode 添加包。 有关更多信息,请参阅Swift Package Documentation。
@CodableValue
可以编码/解码以下类型
属性包装器被设计为对 API 用户非常透明。 可选项也可以使用相同的属性包装器。
在你想要使用的属性上声明属性包装器。 例如
@CodableValue var image: UIImage?
@CodableValue var swiftImage = UIImage(systemName: "swift")!
@CodableValue var color: UIColor = .systemBlue
当初始化值时,例如在自定义类型的 init 方法中
init(image: UIImage?, color: UIColor) {
self.image = image
self.color = color
}
@CodableValue var image: NSImage?
@CodableValue var color: NSColor
如果包装的值也符合 Equatable
,则 CodableValue
也符合 Equatable
。
如果包装的值也符合 Hashable
,则 CodableValue
也符合 Hashable
。
这个包的目的是让我学习属性包装器。 一些类型不符合 Codable,并且不能自动合成所需的方法。 当数据模型只有少数这些属性时 - 而其余的都支持 Codable - 那么最好让编译器自动合成 Codable 一致性,而不是为已经支持它的属性编写大量的样板代码。 向 UIKit 类型添加 Encodable 一致性很容易在该类型的扩展中完成。 但是 Decodable 一致性不起作用,因为它是一个必需的初始化器,并且我猜测 UIKit 类的实现细节阻止了人们在扩展中创建 init(from decoder: Decoder)
方法。 我花费了大量时间来处理这个问题,并且这个解决方案似乎从 API 的角度来看是最稳定且最容易理解的。
在 MIT 许可证下提供。 有关更多信息,请参阅LICENSE。