Возможно ли в Swift 4.2 написать расширение по умолчанию для перечисления с rawValue определенного типа? - PullRequest
0 голосов
/ 10 января 2019

Я выполняю рефакторинг кода в 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.

Я не уверен, что то, что я пытаюсь сделать, возможно? Любая помощь будет высоко ценится!

Спасибо!

1 Ответ

0 голосов
/ 10 января 2019

Вы поставляете конкретный тип 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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...