我正在将代码重构为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调用枚举初始化程序。
我不确定我想做什么?任何帮助将不胜感激!
谢谢!
答案 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)
}
}