in ,

Swift: Referans Eşitliği

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.

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.

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: Yapılar ve sınıflar arasındaki farklar

Swift: Enum Kullanımı