Я строю некоторую логику для моделирования ранжирования рук в покере.Начал с протокола для определения покерной руки.
public protocol PokerHand: Comparable {
//Some definitions here
}
Затем я сделал 10 структур, по одной на руку, все соответствующие PokerHand
, например:
///RoyalFlush is A, K, Q, J, 10, all the same suit.
public struct RoyalFlush: PokerHand {
//Properties and initializers here
}
extension PokerHandRanking: Comparable {
//Comparable logic
}
На этом этапе каждый тип, соответствующий PokerHand
, может сравниваться с другим типом того же типа.
Теперь я хочу иметь возможность сравнить все из них, даже если они не принадлежат к одному и тому же типу.(Например, royalFlush > pair
) Итак, я начал с этого:
struct PokerHandRanking<Hand: PokerHand> {
let hand: Hand
init(hand: Hand) {
self.hand = hand
}
}
И так как подтверждение Comparable
- это то, что я хочу:
extension PokerHandRanking: Comparable {
public static func < <T: PokerHand, S: PokerHand> (lhs: PokerHandRanking<T>, rhs: PokerHandRanking<S>) -> Bool {
//some logic should be here
return false
}
public static func == <T: PokerHand, S: PokerHand> (lhs: PokerHandRanking<T>, rhs: PokerHandRanking<S>) -> Bool {
//some logic should be here
return false
}
}
Однако это не работает,при выполнении следующих действий:
let royalFlush = RoyalFlush(...)
let fourOfAKind = FourOfAKind(...)
XCTAssert(royalFlush == royalFlush) //works
XCTAssert(royalFlush == fourOfAKind) //Ambiguous reference to member '=='
Я получаю Ambiguous reference to member '=='
при сравнении различных PokerHand
соответствующих типов.
Чего мне не хватает?(Я использую swift 4.2)