Sau khi đọc Cách kiểm tra tính bình đẳng của enum Swift với các giá trị được liên kết , tôi đã triển khai enum sau:
enum CardRank {
case Number(Int)
case Jack
case Queen
case King
case Ace
}
func ==(a: CardRank, b: CardRank) -> Bool {
switch (a, b) {
case (.Number(let a), .Number(let b)) where a == b: return true
case (.Jack, .Jack): return true
case (.Queen, .Queen): return true
case (.King, .King): return true
case (.Ace, .Ace): return true
default: return false
}
}
Đoạn mã sau hoạt động:
let card: CardRank = CardRank.Jack
if card == CardRank.Jack {
print("You played a jack!")
} else if card == CardRank.Number(2) {
print("A two cannot be played at this time.")
}
Tuy nhiên, điều này không biên dịch:
let number = CardRank.Number(5)
if number == CardRank.Number {
print("You must play a face card!")
}
... và nó đưa ra thông báo lỗi sau:
Toán tử nhị phân '==' không thể được áp dụng cho các toán hạng thuộc loại 'CardRank' và '(Int) -> CardRank'
Tôi giả định điều này là do nó mong đợi một loại đầy đủ và CardRank.Number
không chỉ định một loại toàn bộ, trong khi đó CardRank.Number(2)
. Tuy nhiên, trong trường hợp này, tôi muốn nó khớp với bất kỳ số nào ; không chỉ là một cái cụ thể.
Rõ ràng là tôi có thể sử dụng một câu lệnh switch, nhưng toàn bộ điểm của việc triển ==
khai toán tử là để tránh giải pháp dài dòng này:
switch number {
case .Number:
print("You must play a face card!")
default:
break
}
Có cách nào để so sánh một enum với các giá trị được liên kết trong khi bỏ qua giá trị được liên kết của nó không?
Lưu ý: Tôi nhận ra rằng tôi có thể thay đổi trường hợp trong ==
phương thức thành case (.Number, .Number): return true
, nhưng, mặc dù nó sẽ trả về true một cách chính xác, so sánh của tôi vẫn trông giống như so với một số cụ thể ( number == CardRank.Number(2)
; trong đó 2 là một giá trị giả) hơn là bất kỳ số nào ( number == CardRank.Number
).
Jack
,Queen
,King
,Ace
trường hợp trong==
thực hiện hành để chỉ:case (let x, let y) where x == y: return true