swift - 在 Swift 4.2 中是否可以使用特定类型的 rawValue 为枚举编写默认扩展?
问题描述
我正在将代码重构为解析二进制流的 Swift 4.2。我正在使用协议从数据对象中读取值。
public protocol DataExchangable {
init(from data:Data, at pos: inout Int) throws
var data:Data { get }
}
我已经编写了数字数据类型的扩展,例如。UInt16 使这些类型符合协议。
流数据的一部分是各种类型的 id,到目前为止都表示为枚举。例如:
public enum FormatID: UInt16 {
case PNG = 0x0000, DPX, JPG, TIF
}
我确实有一大堆这些,我可以单独扩展每个枚举以符合协议,但是能够为所有枚举定义默认扩展会更有效率。
我努力了:
extension RawRepresentable where RawValue:DataExchangable {
public init(from data: Data, at pos: inout Int) throws {
let u16 = UInt16(from: data, at:&pos)
self.init(rawValue: u16)
}
}
这里的问题是代码不允许我使用 UInt16 调用枚举初始化程序,尽管 UInt16 符合 CAPDataExchangeable。
我不确定我想要做什么是可能的?任何帮助将非常感激!
谢谢!
解决方案
您在UInt16
更广泛的扩展中提供具体类型,即RawRepresentable....etc
. 所以替换UInt16
为RawValue
.
此外,由于self.init
是可失败的,您需要扩展初始化程序也可以失败。
下面的代码编译
extension RawRepresentable where RawValue: DataExchangable {
public init?(from data: Data, at pos: inout Int) throws {
let dataExchangeValue = try RawValue(from: data, at: &pos)
self.init(rawValue: dataExchangeValue)
}
}
推荐阅读
- python - 即使在调用 pool.close 和 pool.join 之后,Python 多处理高内存使用率
- google-tag-manager - 数据层变量中的逗号分隔列表
- r - 如何遍历 ggplot2 中变量中的值/因子?
- java - 子类化 AssetsManager.AssetInputStream 以使用 BitmapFactory.decodeStream 读取它
- linux - 通过 Bash 更改 txt 文件
- html - Bootstrap 4折叠按钮不可点击
- facebook-graph-api - Instagram 企业帐户的历史关注者计数信息
- jsf - triStateCheckbox 不呈现初始值
- r - 在 ggplot2 上更改颜色
- angular - 我可以在不使用角度 2+ 的 cookie 的情况下将 json 对象发送到 restApi