Возможно ли для перечисления Swift с Comparable raw-значениями автоматически синтезировать реализации Comparable протокола? - PullRequest
0 голосов
/ 16 февраля 2019

Swift может автоматически синтезировать реализации Equatable для структур и перечислений.Точно так же я хочу, чтобы enum также автоматически соответствовал протоколу Comparable.

Вот что я сделал:

enum RoyalRank: UInt8 { 
  case emperor = 3
  case king    = 2
  case duke    = 1
}

let e = RoyalRank.emperor
let k = RoyalRank.king
print(e > k)

Но, конечно, он не скомпилируется.Я получил следующую ошибку:

error: cannot convert value of type 'RoyalRank' to expected argument type 'UInt8'
print(e > k)
      ^
       .rawValue

Можно ли как-нибудь сделать так, чтобы перечисление соответствовало Comparable протоколу автоматически ?

1 Ответ

0 голосов
/ 16 февраля 2019

Вам просто нужно указать стандартную реализацию оператора < для RawRepresentable, когда его RawValue соответствует Comparable:

extension RawRepresentable where RawValue : Comparable {
    static func < (lhs: Self, rhs: Self) -> Bool {
        return lhs.rawValue < rhs.rawValue
    }
}

enum RoyalRank: UInt8, Comparable {
    case emperor = 3
    case king    = 2
    case duke    = 1
}


let e = RoyalRank.emperor
let k = RoyalRank.king
print(e > k)

Добавить Comparable к вашему enumи вуаля!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...