Eu tenho esta estrutura Swift:
struct Foo {
let i: Int
}
let f1 = Foo(i: 1)
let f2 = Foo(i: 2)
Então no LLDB, eu os lanço __SwiftValue
e imprimo:
p (f1 as AnyObject)
(__SwiftValue) 0x00000001676332d0 {
baseNSObject@0 = {
isa = __SwiftValue
}
}
p (f2 as AnyObject)
(__SwiftValue) 0x0000000167633300 {
baseNSObject@0 = {
isa = __SwiftValue
}
}
Como você pode ver, os endereços dos dois são diferentes, o que faz sentido, pois são dados diferentes em locais de memória separados.
Porém, se eu tomar ObjectIdentifier
, eles são iguais:
p ObjectIdentifier(f1 as AnyObject)
(ObjectIdentifier) ObjectIdentifier(0x00000001676332d0) {
_value = 0x00000001676332d0
}
p ObjectIdentifier(f2 as AnyObject)
(ObjectIdentifier) ObjectIdentifier(0x00000001676332d0) {
_value = 0x00000001676332d0
}
Esse comportamento estranho basicamente diz que "ObjectIdentifier igual" não significa "endereço igual" ( ===
):
p (f1 as AnyObject === f2 as AnyObject)
(Bool) (_value = 0)
p (ObjectIdentifier(f1 as AnyObject) == ObjectIdentifier(f2 as AnyObject))
(Bool) (_value = 1)
Por que é assim? Pelo que entendi, é __SwiftValue
uma subclasse de NSObject
, então deveriam ter ObjectIdentifier
s diferentes. Isso é estranho.
Atualizar:
Adicionei código de exemplo fora do LLDB:
let f1 = Foo(i: 1)
let f2 = Foo(i: 2)
let b1 = (f1 as AnyObject) === (f2 as AnyObject)
let b2 = ObjectIdentifier(f1 as AnyObject) == ObjectIdentifier(f2 as AnyObject)
E obteve b1 = falso e b2 = verdadeiro no depurador:
A documentação diz:
Na expressão:
Depois que o lado esquerdo de
==
produz umObjectIdentifier
, o objeto Obj-C criado porf1 as AnyObject
não está mais ativo. OObjectIdentifier
não é mais válido para comparações, então o resultado da==
comparação não tem sentido.A desinicialização de
f1 as AnyObject
pode ser vista mais claramente se você substituí-la por sua própria classe:Se você primeiro armazenar
f1 as AnyObject
ef2 as AnyObject
em variáveis locais, você as manterá ativas e poderá comparar legitimamente seus identificadores de objeto.Veja também: https://github.com/swiftlang/swift/issues/56002