Arasındaki Fark, Swift'de bir kök sınıf uygulayayım diyelim ki, Equatable
protokolünü kabul ettiğimi bildiriyorum (türümün bir dizisinin içerip içermediğini anlamak istiyorum) belirli bir örnek veya değil). olarak protokolün gerektirdiği ==
operatörü uygulanması arasındaki bu özel vakadan- içinde, herhangi -eğer farkı nedirObjectIdentifier() ve '===' Kullanıcısı Operatör
:
public static func ==(lhs: MyClass, rhs: MyClass) -> Bool {
return ObjectIdentifier(lhs) == ObjectIdentifier(rhs)
}
... aksine sadece bunu yapmaya:
public static func ==(lhs: MyClass, rhs: MyClass) -> Bool {
return (lhs === rhs)
}
Bir başvuru olarak, belgenin ObjectIdentifier()
::
sınıf örneği veya metatype için benzersiz bir tanımlayıcı. Swift'de yalnızca sınıf örnekleri ve metatiplerin benzersiz kimlikleri vardır. Yapılar, sayılar, işlevler veya kopyalar için kimlik kavramı yoktur.
... ve bu The Swift Programming Language (Swift 3) "Temel Operatörleri" bölümü ===
operatör için söyledikleridir:
Swift ayrıca iki kimlik operatörleri (===
ve !==
) içerir
NOT, iki nesne başvurusunun her ikisinin de aynı nesne örneğine başvurup başvurmadığını test etmek için kullandığınız. Daha fazla bilgi için bkz. Sınıflar ve Yapılar. sınıf örneği bir fark yoktur
Çok detaylı yanıt için teşekkür ederiz. Kendi sınıflarım için büyük bir fark beklemiyordum, ama bu çok aydınlatıcı. Kaynak kodunu kontrol etmeyi düşünmeliydim, şimdi Swift açık kaynak! –
'===' operatör [şimdi doğrudan karşılaştırır] (https://github.com/apple/swift/blob/b330c6078fd233ea7206158a20b21b4672d75cc3/stdlib/public/core/Equatable.swift#L249) 'ObjectIdentifier 'parametrelerinin. – execv