संबंधित मूल्यों के साथ स्विफ्ट एनम की समानता का परीक्षण करने के तरीके को पढ़ने के बाद , मैंने निम्नलिखित एनम को लागू किया:
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.Number
एक पूरे प्रकार को निर्दिष्ट नहीं करता है, जबकि CardRank.Number(2)
किया। हालाँकि, इस मामले में, मैं चाहता हूं कि यह किसी भी संख्या से मेल खाए ; सिर्फ एक विशिष्ट नहीं।
जाहिर है मैं एक स्विच स्टेटमेंट का उपयोग कर सकता हूं, लेकिन ==
ऑपरेटर को लागू करने का पूरा बिंदु इस क्रिया समाधान से बचना था:
switch number {
case .Number:
print("You must play a face card!")
default:
break
}
क्या संबंधित मूल्य की अनदेखी करते हुए संबंधित मूल्यों के साथ एक दुश्मनी की तुलना करने का कोई तरीका है?
नोट: मुझे एहसास है कि मैं मामले को ==
विधि में बदल सकता हूं 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