我正在建立一些模型来模拟扑克的手部排名。 从定义扑克手的协议开始。
$lookup = array_flip(file('small.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));
if($file = fopen('big.txt', 'r')){
while(!feof($file)){
$line = rtrim(fgets($file));
if (isset($lookup[$line])) {
echo "$lines : exists.\n";
}
}
fclose($file);
}
然后,我制作了10个结构,每手一个,都符合public protocol PokerHand: Comparable {
//Some definitions here
}
,例如:
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 '=='
。
我想念什么? (我使用的是Swift 4.2)