Java'dan sonra hızlı bir şekilde öğrenmeye başladım. Java'da herhangi bir nesneyi HashSet için bir anahtar olarak kullanabilirim, bu nedenle nesne tanımlayıcısına bağlı olarak varsayılan hashCode
ve equals
vardır. Swift'de aynı davranış nasıl elde edilir?Swift, nesne referansına dayalı Hashable protokolü nasıl uygulanır?
9
A
cevap
21
Sınıflarla ve yapılarla çalışmıyorsanız, ObjectIdentifier
yapısını kullanabilirsiniz. Ayrıca, Equatable
(Hashable
gerektiriyorsa) için sınıfınız için ==
tanımlamanız gerektiğini unutmayın. Böyle bir şey olacaktır:
class MyClass: Hashable { }
func ==(lhs: MyClass, rhs: MyClass) -> Bool {
return ObjectIdentifier(lhs) == ObjectIdentifier(rhs)
}
class MyClass: Hashable {
var hashValue: Int {
return ObjectIdentifier(self).hashValue
}
}
1
Tüm kredi answer için. Yeniden kullanılabilirlik için bir temel sınıfa dönüştürüldü, birine yardım edebilir! open
gibi tüm ekstra şeyler, bunu yeniden kullanılabilir bir temel çerçeve bileşenine koyabilirsiniz.
open class HashableClass {
public init() {}
}
// MARK: - <Hashable>
extension HashableClass: Hashable {
public var hashValue: Int {
return ObjectIdentifier(self).hashValue
}
}
// MARK: - <Equatable>
extension HashableClass: Equatable {}
public func ==(lhs: HashableClass, rhs: HashableClass) -> Bool {
return ObjectIdentifier(lhs) == ObjectIdentifier(rhs)
}
sadece sınıf ve alt sınıf HashableClass
almak, kullanmak için, sonra her şey sadece çalışmalı!
class MyClass: HashableClass {
}
http://stackoverflow.com/questions/30345700/reference-as-key-in-swift-dictionary? –