2016-01-10 13 views
9

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?

+1

http://stackoverflow.com/questions/30345700/reference-as-key-in-swift-dictionary? –

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 { 

} 
İlgili konular