我有这个 Swift 结构:
struct Foo {
let i: Int
}
let f1 = Foo(i: 1)
let f2 = Foo(i: 2)
然后在 LLDB 中,我将它们转换为__SwiftValue
并打印出来:
p (f1 as AnyObject)
(__SwiftValue) 0x00000001676332d0 {
baseNSObject@0 = {
isa = __SwiftValue
}
}
p (f2 as AnyObject)
(__SwiftValue) 0x0000000167633300 {
baseNSObject@0 = {
isa = __SwiftValue
}
}
正如您所看到的,这两个地址是不同的,这是有道理的,因为它们无论如何都是位于不同内存位置的不同数据。
但是,如果我取ObjectIdentifier
,它们就相等:
p ObjectIdentifier(f1 as AnyObject)
(ObjectIdentifier) ObjectIdentifier(0x00000001676332d0) {
_value = 0x00000001676332d0
}
p ObjectIdentifier(f2 as AnyObject)
(ObjectIdentifier) ObjectIdentifier(0x00000001676332d0) {
_value = 0x00000001676332d0
}
这种奇怪的行为基本上是说“相等的 ObjectIdentifier”并不意味着“相等的地址”(===
):
p (f1 as AnyObject === f2 as AnyObject)
(Bool) (_value = 0)
p (ObjectIdentifier(f1 as AnyObject) == ObjectIdentifier(f2 as AnyObject))
(Bool) (_value = 1)
为什么会这样?我的理解是__SwiftValue
是 的子类NSObject
,所以它们应该有不同的ObjectIdentifier
s 。这很奇怪。
更新:
我在 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)
并在调试器中得到 b1 = false 和 b2 = true:
文档中说:
在表达式中:
当 的左侧
==
生成后ObjectIdentifier
,由 创建的 Obj-C 对象f1 as AnyObject
就不再存在了。ObjectIdentifier
不再可用于比较,因此比较结果==
毫无意义。f1 as AnyObject
如果你用自己的类替换它,则可以更清楚地看到它的取消初始化:如果您首先将
f1 as AnyObject
和存储f2 as AnyObject
到局部变量中,则可以使它们保持活动状态,并且可以合法地比较它们的对象标识符。另请参阅: https: //github.com/swiftlang/swift/issues/56002