Per Swift 3 (Xcode 8 beta 6 o successivo), utilizzare ObjectIdentifier
.
class Test : Hashable {
// Swift 2:
var hashValue: Int { return unsafeAddressOf(self).hashValue }
// Swift 3:
var hashValue: Int { return ObjectIdentifier(self).hashValue }
}
func ==(lhs: Test, rhs: Test) -> Bool {
return lhs === rhs
}
Poi a == b
sse a
e b
riferiscono alla stessa istanza della classe ( e a.hashValue == b.hashValue
è soddisfatta in questo caso).
Esempio:
var dictionary = [Test: String]()
let a = Test()
let b = Test()
dictionary[a] = "A"
print(dictionary[a]) // Optional("A")
print(dictionary[b]) // nil
per SWIFT 2.3 e versioni precedenti, è possibile utilizzare
/// Return an UnsafePointer to the storage used for `object`. There's
/// not much you can do with this other than use it to identify the
/// object
func unsafeAddressOf(object: AnyObject) -> UnsafePointer<Void>
per implementare un valore hash, e l'operatore identità ===
al implementare il protocollo Equatable
.
fonte
2015-05-20 09:38:02
'unsafeAddressOf' è quello che ho sempre cercato. Grazie! – Kirsteins
Ci sarà un caso in cui 'unsafeAddressOf' restituirà un indirizzo diverso per la stessa variabile? Mi sembra di aver incontrato questo problema e non riesco più a riprodurlo. L'indirizzo direbbe una cosa all'inizio e poi cambierebbe, come se Swift spostasse la variabile in memoria altrove. – pixelfreak
Non per istanze di * classe *. Ma vedi http://stackoverflow.com/questions/32638879/swift-strings-and-memory-addresses per un caso in cui accadrebbe per determinati * tipi di valori * che sono implicitamente sottoposti a bridge su alcuni NSObject. –