İlişkili değerlerle Swift numaralandırmalarının eşitliği nasıl test edilir okuduktan sonra , aşağıdaki numaralandırmayı uyguladım:
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
}
}
Aşağıdaki kod çalışır:
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.")
}
Ancak, bu derlemez:
let number = CardRank.Number(5)
if number == CardRank.Number {
print("You must play a face card!")
}
... ve aşağıdaki hata mesajını verir:
İkili operatör '==', 'CardRank' ve '(Int) -> CardRank' türündeki işlenenlere uygulanamaz
Bunun, tam bir tip beklemesinden ve tam bir türü CardRank.Number
belirtmemesinden kaynaklandığını varsayıyorum , oysa CardRank.Number(2)
yaptı. Ancak bu durumda herhangi bir sayı ile eşleşmesini istiyorum ; sadece belirli bir tane değil.
Açıkçası bir switch ifadesi kullanabilirim, ancak ==
operatörü uygulamanın tüm amacı bu ayrıntılı çözümden kaçınmaktı:
switch number {
case .Number:
print("You must play a face card!")
default:
break
}
İlişkili değerini göz ardı ederek bir numaralandırmayı ilişkili değerlerle karşılaştırmanın herhangi bir yolu var mı?
Not:==
Yöntemdeki durumu olarak değiştirebileceğimin farkındayım case (.Number, .Number): return true
, ancak doğru olarak dönecek olsa da, karşılaştırmam yine de herhangi bir sayıdan number == CardRank.Number(2)
ziyade belirli bir sayı ( burada 2 bir kukla değerdir) ile karşılaştırılmış gibi görünecektir. ( ).number == CardRank.Number
Jack
,Queen
,King
,Ace
vakaları==
: Sadece için operatör uygulamasıcase (let x, let y) where x == y: return true