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.Numberkhô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,Acetrường hợp trong==thực hiện hành để chỉ:case (let x, let y) where x == y: return true