在Swift 4.2中是否可以将默认扩展写入具有特定类型rawValue的枚举?

时间:2019-01-10 16:35:40

标签: swift enums

我正在将代码重构为Swift 4.2,该代码解析二进制流。我正在使用协议从数据对象读取值。

<changeSet id="myId" author="myName">
<preConditions onFail="MARK_RAN">
    <sqlCheck expectedResult=????>SELECT COUNT(1) FROM tableB WHERE column2 IS NOT NULL;
    </sqlCheck>
</preConditions>
<insert tableName="tableA">
    <column name="column1" valueComputed="(SELECT columnA FROM tableB WHERE columnB IS NOT NULL;)" />
    <column name="column2" valueComputed="(SELECT columnB FROM tableB WHERE columnB IS NOT NULL;)" />
</insert>

我已经写了数字数据类型的扩展名,例如。使这些类型符合UInt16的协议。

流数据的一部分是各种类型ID,到目前为止,这些类型ID被表示为枚举。例如:

public protocol DataExchangable {
    init(from data:Data, at pos: inout Int) throws
    var data:Data { get }
}

我确实有很多,并且我可以分别扩展每个枚举以符合协议,但是能够为所有枚举定义默认扩展会更有效。

我尝试过:

public enum FormatID: UInt16 {
    case PNG = 0x0000, DPX, JPG, TIF
}

这里的问题是,尽管UInt16符合CAPDataExchangeable,但代码不允许我使用UInt16调用枚举初始化程序。

我不确定我想做什么?任何帮助将不胜感激!

谢谢!

1 个答案:

答案 0 :(得分:1)

您要在更广泛的扩展名(即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)
    }
}