的任何子类NSObject
继承了description https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.html#//apple_ref/occ/intfm/NSObject/description的方法NSObject
(定义在NSObjectProtocol
):
class Foo1 : NSObject { }
print(Foo1())
// <MyProject.Foo1: 0x100612fd0>
这个“默认实现”打印类名和内存
对象的地址,例如周五问答 2013-01-25:让我们构建 NSObject https://mikeash.com/pyblog/friday-qa-2013-01-25-lets-build-nsobject.html,其中显示了 Objective-C 的实现方式
可能看起来像:
- (NSString *)description
{
return [NSString stringWithFormat: @"<%@: %p>", [self class], self];
}
The %p
format 将指针的值打印为十六进制数,
之前是0x
.
为了在 Swift 中模仿,我们可以使用
-
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]
这也适用于“纯 Swift 类”,因为没有基础
使用方法:
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]
请注意(正如上面的评论中已经提到的),哈希值
对象的地址不一定与内存地址相同。
一个简单的例子是NSArray()
其哈希值只是数字
元素数量:
let array = NSArray(objects: 1, 2, 3)
print(unsafeAddressOf(array)) // 0x00000001020011a0
print(array.hashValue) // 3
Swift 3 更新:
class Bar : CustomStringConvertible {
var description : String {
let className = String(reflecting: type(of: self))
let address = Unmanaged.passUnretained(self).toOpaque()
return "[\(className): \(address)]"
}
}