Я выполняю рефакторинг кода в Swift 4.2, который анализирует двоичный поток. Я использую протокол для чтения значений из объекта данных.
public protocol DataExchangable {
init(from data:Data, at pos: inout Int) throws
var data:Data { get }
}
Я написал расширения для числовых типов данных, например. UInt16, которые делают эти типы соответствующими протоколу.
Часть потоковых данных - это идентификаторы различных типов, которые пока представлены как enum. Например:
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.
Я не уверен, что то, что я пытаюсь сделать, возможно? Любая помощь будет высоко ценится!
Спасибо!