in ,

Swift: Enum Kullanımı

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.

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.

Comments

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

GIPHY App Key not set. Please check settings

Yükleniyor…

0

Ne düşünüyorsun?

Swift: Referans Eşitliği

Android LiveData