首页 > 解决方案 > 在 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。

我不确定我想要做什么是可能的?任何帮助将非常感激!

谢谢!

标签: swiftenums

解决方案


您在UInt16更广泛的扩展中提供具体类型,即RawRepresentable....etc. 所以替换UInt16RawValue.

此外,由于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)
    }
}

推荐阅读