หลังจากอ่านวิธีทดสอบความเท่าเทียมกันของ Swift enums กับค่าที่เกี่ยวข้องฉันได้ใช้ enum ต่อไปนี้:
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
}
}
รหัสต่อไปนี้ใช้งานได้:
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.")
}
อย่างไรก็ตามสิ่งนี้ไม่ได้รวบรวม:
let number = CardRank.Number(5)
if number == CardRank.Number {
print("You must play a face card!")
}
... และมีข้อความแสดงข้อผิดพลาดต่อไปนี้:
ตัวดำเนินการไบนารี '==' ไม่สามารถใช้กับตัวถูกดำเนินการประเภท 'CardRank' และ '(Int) -> CardRank'
ฉันสมมติว่านี่เป็นเพราะคาดว่าจะเป็นประเภทเต็มและCardRank.Number
ไม่ได้ระบุประเภททั้งหมดในขณะที่CardRank.Number(2)
ทำ อย่างไรก็ตามในกรณีนี้ฉันต้องการให้ตรงกับตัวเลขใด ๆ ไม่ใช่แค่เรื่องที่เจาะจง
เห็นได้ชัดว่าฉันสามารถใช้คำสั่ง switch ได้ แต่จุดรวมของการใช้ตัว==
ดำเนินการคือหลีกเลี่ยงโซลูชัน verbose นี้:
switch number {
case .Number:
print("You must play a face card!")
default:
break
}
มีวิธีใดในการเปรียบเทียบ enum กับค่าที่เกี่ยวข้องโดยไม่สนใจค่าที่เกี่ยวข้อง
หมายเหตุ:ฉันรู้ว่าฉันสามารถเปลี่ยนกรณีใน==
วิธีการเป็นcase (.Number, .Number): return true
แต่แม้ว่ามันจะคืนค่าจริงอย่างถูกต้อง แต่การเปรียบเทียบของฉันก็ยังคงดูเหมือนเมื่อเทียบกับจำนวนเฉพาะ ( number == CardRank.Number(2)
โดยที่ 2 เป็นค่าดัมมี่) แทนที่จะเป็นตัวเลขใด ๆ ( number == CardRank.Number
).
Jack
,Queen
,King
,Ace
กรณีใน==
การดำเนินการผู้ประกอบการที่จะเพียงแค่:case (let x, let y) where x == y: return true