CodableValue

利用 Swift 5.1 中包含的 Swift 属性包装器来解码 UIColor 和 UIImage (UIKit) 以及 NSColor 和 NSImage (AppKit)

Swift Package Manager compatible

GitHub last commit GitHub license

安装

此版本仅支持 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
}

或在 AppKit 中。 例如

@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