Enumları Swift’de karşılaştırmak çok basittir – ilişkili değerleri olmadıkça. Bu yazıda, bu durumda ne yapabileceğinizi tartışacağız.
Değerleri İlişkili Değerler olmadan Karşılaştırma
enum TestEnum {
case testA
case testB
}
let testEnum1 = TestEnum.testA
let testEnum2 = TestEnum.testB
let testEnum3 = TestEnum.testA
print(testEnum1 == testEnum2) //false
print(testEnum1 == testEnum3) //true
Yani bu örnekte TestEnum adlı iki durumu olan bir numara tanımlıyoruz . O zaman bu tip iki değişken ilan ediyoruz ve onları karşılaştırıyoruz – beklendiği gibi davranıyorlar ve her şey iyi çalışıyor.
Enums’leri İlişkili Değerlerle Karşılaştırma
Şimdi zor malzemelere bakalım. Öncelikle, vakalardan birine ilişkili bir değer ekledik:
enum TestEnum {
case testA(Int)
case testB
}
let testEnum1 = TestEnum.testA(5)
Ancak yalnızca bir switch ifadesinde erişilebilir :
enum TestEnum {
case testA(Int)
case testB
}
let testEnum1 = TestEnum.testA(5)
switch testEnum1 {
case .testA(let a):
print("Case testA with associated value \(a)")
case .testB:
print("Case testB")
}
Beklendiği gibi çıktı
Case testA with associated value 5
Şimdi ikisini karşılaştırmaya çalışalım:
enum TestEnum {
case testA(Int)
case testB
}
let testEnum1 = TestEnum.testA(5)
let testEnum2 = TestEnum.testB
if testEnum1 == testEnum2 { //COMPILER ERROR!!!
print("equal")
}
Bu durumda bir derleyici hatası alıyoruz:
Binary operator '==' cannot be applied to two 'TestEnum' operands
Ve bu mükemmel bir anlam ifade ediyor çünkü eşit olduklarında net değiller. Örneğin, ilişkili değerleri eşitse iki testA değeri eşit midir? Veya iki testA değeri her zaman eşit midir? Koşullara, enumun anlamına bağlı.
Fakat aslında == ‘nin kendi uygulamamızı uygulayabiliriz . Bunun için Equatable protokolünü uyguluyoruz :
enum TestEnum {
case testA(Int)
case testB
}
extension TestEnum: Equatable {
public static func ==(lhs: TestEnum, rhs:TestEnum) -> Bool {
switch lhs {
case .testA(let a):
switch rhs {
case .testA(let b):
return a == b
case .testB:
return false
}
case .testB:
switch rhs {
case .testB:
return true
case .testA:
return false
}
}
}
}
Biraz iş için çok fazla kod var ama işi yapıyor! Şimdi, aşağıdaki iki koşuldan biri doğruysa , iki TestEnum eşittir:
- Her ikisi de testB vakalarıdır.
- Her ikisi de testA durumlarıdır ve ilişkili değerleri eşittir.
Elbette bu kodu biraz daha şık yazmak mümkün:
enum TestEnum {
case testA(Int)
case testB
}
extension TestEnum: Equatable {
public static func ==(lhs: TestEnum, rhs:TestEnum) -> Bool {
switch (lhs,rhs) {
case (.testB, .testB):
return true
case (.testA(let a), .testA(let b)):
return a == b
default:
return false
}
}
}
Şimdi de beklendiği gibi çalışıp çalışmadığını test edelim:
let testEnum1 = TestEnum.testA(5)
let testEnum2 = TestEnum.testA(10)
let testEnum3 = TestEnum.testA(5)
let testEnum4 = TestEnum.testB
let testEnum5 = TestEnum.testB
print(testEnum1 == testEnum2) //false
print(testEnum1 == testEnum3) //true
print(testEnum1 == testEnum4) //false
print(testEnum4 == testEnum5) //true
Açıkçası, bunun gibi başka bir şekilde de uygulanabilir:
- Her ikisi de testB vakalarıdır.
- Her ikisi de testA vakalarıdır
Öyleyse, ilişkili değerlerin eşitlik üzerinde bir etkisi yoktur:
extension TestEnum: Equatable {
public static func ==(lhs: TestEnum, rhs:TestEnum) -> Bool {
switch (lhs,rhs) {
case (.testB, .testB):
return true
case (.testA,.testA):
return true
default:
return false
}
}
}
let testEnum1 = TestEnum.testA(5)
let testEnum2 = TestEnum.testA(10)
let testEnum3 = TestEnum.testA(5)
let testEnum4 = TestEnum.testB
let testEnum5 = TestEnum.testB
print(testEnum1 == testEnum2)
print(testEnum1 == testEnum3)
print(testEnum1 == testEnum4)
print(testEnum4 == testEnum5)
Daha önce de belirtildiği gibi, içeriğe bağlıdır.
GIPHY App Key not set. Please check settings