Sınıf örneklerinin eşitliğini test etmenin iki yolu vardır: referans eşitliği ve değer eşitliği. Bu yazıda ikisini de tartışacağız.
Identity Operator ===
Identity operatörünü kullanarak === bir sınıfın örneklerine işaret eden referansları karşılaştırabilirsiniz. Bu referanslar aynı örneği gösteriyorsa, operatör true değerini döndürür. Aşağıdaki örneğe bir göz atın:
Class TestA { }
let test1 = TestA()
let test2 = TestA()
let test3 = test1
print("test1 and test2 pointing to the same instance: \(test1===test2)") //false
print("test1 and test3 pointing to the same instance: \(test1===test3)") //true
Gördüğünüz gibi, test1 ve test3 aynı örneği işaret ederken, test1 ve test2 aynı örneği göstermiyor.
! == işlecini kullanarak eşitsizliği de kontrol edebilirsiniz :
print("test1 and test3 are not pointing to the same instances: \(test1!==test3)" //true
Kimlik operatörünün numaralandırma, yapı ve ilkel veri tipleri için uygun olmadığını unutmayın. Bu mantıklı çünkü bu durumlarda iki değerin aynı örneği göstermesi mümkün değildir.
Eşitlik operatörü ==
Class TestClassA { }
let test1 = TestClassA()
let test2 = TestClassA()
print("test1 is equal to test2 \(test1==test2)") //Compiler error
Son satır bir derleyici hatası veriyor. Bunun yerine, Equatable protokolünü uygulamanız gerekir:
class TestA: Equatable {
let a: Int
init(a:Int) {
self.a = a
}
public static func == (lhs: TestA, rhs: TestA) -> Bool {
return lhs.a == rhs.a
}
}
let test1 = TestA(a:5)
let test2 = TestA(a:6)
let test3 = TestA(a:5)
print("test1 is equal to test2 \(test1==test2)") //false
print("test1 is equal to test3 \(test1==test3)") //true
Gördüğünüz gibi, bu örnekte iki örneği DenemeSınıfı özellikleri ise eşit bir eşittir.
Karşılaştırılabilir protokol
Değer eşitliğini sadece bir sınıfın iki örneği için tanımlamakla kalmaz, aynı zamanda bir sıra da mümkündür. Bunun için, Karşılaştırılabilir protokolü uygulamanız gerekir. Equatable protokolünü genişletir, böylece == işlevi son bölümde açıklandığı şekilde uygulanmalıdır. Ek olarak, < işlevinin de uygulanması gerekir:
class TestClassA: Equatable, Comparable {
let a: Int
init(a:Int) {
self.a = a
}
public static func < (lhs: TestClassA, rhs: TestClassA) -> Bool {
return lhs.a < rhs.a
}
public static func == (lhs: TestClassA, rhs: TestClassA) -> Bool {
return lhs.a == rhs.a
}
}
let test1 = TestClassA(a:5)
let test2 = TestClassA(a:6)
let test3 = TestClassA(a:5)
print("test1 < test2 \(test1<test2)") //true
print("test1 < test3 \(test1<test3)") //false
print("test1 <= test3 \(test1<=test3)") //true
print("test1 > test3 \(test1>test2)") //false
Gördüğünüz gibi, oldukça basittir.
GIPHY App Key not set. Please check settings