的NSObject
不限子类继承的NSObject
的 description
方法(其在NSObjectProtocol
定义):
class Foo1 : NSObject { }
print(Foo1())
// <MyProject.Foo1: 0x100612fd0>
这种“默认实现”打印类名称和对象的存储 地址,看例如 Friday Q&A 2013-01-25: Let's Build NSObject,其中显示了Objective-C的实施 怎么可能是这样的:
- (NSString *)description
{
return [NSString stringWithFormat: @"<%@: %p>", [self class], self];
}
%p
格式将指针的值打印为十六进制数 ,后面跟着0x
。
为了模拟在斯威夫特,我们可以使用
String(reflecting: self.dynamicType)
返回完全合格的类名作为一个字符串,
unsafeAddressOf(self)
它返回一个指向对象的存储 。
实施例(使用方括号[]
证明使用 重写的方法):
class Foo2 : NSObject {
override var description : String {
let className = String(reflecting: self.dynamicType)
let address = unsafeAddressOf(self)
return String(format: "[%@: %p]", className, address)
}
}
print(Foo2())
// [MyProject.Foo2: 0x100613310]
class Foo3 : Foo2 { }
print(Foo3())
// [MyProject.Foo3: 0x102000540]
这适用于“纯夫特班”为好,因为没有使用基金会 方法:
class Bar : CustomStringConvertible {
var description : String {
let className = String(reflecting: self.dynamicType)
let address = unsafeAddressOf(self)
return String(format: "[%@: %p]", className, address)
}
}
print(Bar())
// [MyProject.Bar: 0x102001200]
注意(如已经在上面提到的评论),对象的哈希值 不一定identica l到内存地址。 一个简单的例子是NSArray()
其哈希值是元素的只是数量 :
let array = NSArray(objects: 1, 2, 3)
print(unsafeAddressOf(array)) // 0x00000001020011a0
print(array.hashValue) // 3
更新斯威夫特3:
class Bar : CustomStringConvertible {
var description : String {
let className = String(reflecting: type(of: self))
let address = Unmanaged.passUnretained(self).toOpaque()
return "[\(className): \(address)]"
}
}
如何定义你的课吗?如果你不覆盖它,什么会'self.description'打印? –
“这给了我完全相同的输出打印(super.description)会做”不,因为散列不是内存地址。这似乎是一个没有问问题,你真的想要的答案... – matt
我很抱歉让我重写这个问题。 – Mark