是否有一种方法可以在swift中打印变量的运行时类型?例如:
var now = NSDate()
var soon = now.dateByAddingTimeInterval(5.0)
println("\(now.dynamicType)")
// Prints "(Metatype)"
println("\(now.dynamicType.description()")
// Prints "__NSDate" since objective-c Class objects have a "description" selector
println("\(soon.dynamicType.description()")
// Compile-time error since ImplicitlyUnwrappedOptional<NSDate> has no "description" method
在上面的例子中,我正在寻找一种方法来显示变量“soon”的类型是ImplicitlyUnwrappedOptional<NSDate>,或至少NSDate!
编辑:在Swift 1.2 (Xcode 6.3)中引入了一个新的toString函数。
你现在可以使用.self和使用.dynamicType打印任意类型的需求类型:
struct Box<T> {}
toString("foo".dynamicType) // Swift.String
toString([1, 23, 456].dynamicType) // Swift.Array<Swift.Int>
toString((7 as NSNumber).dynamicType) // __NSCFNumber
toString((Bool?).self) // Swift.Optional<Swift.Bool>
toString(Box<SinkOf<Character>>.self) // __lldb_expr_1.Box<Swift.SinkOf<Swift.Character>>
toString(NSStream.self) // NSStream
试着调用你的类。self和youobject . dynamictype。
参考:https://devforums.apple.com/thread/227425。
我为自己开发的类(或您可以访问的类)找到了一个解决方案。
在你的对象类定义中放置以下计算属性:
var className: String? {
return __FILE__.lastPathComponent.stringByDeletingPathExtension
}
现在你可以像这样简单地调用对象的类名:
myObject.className
请注意,只有当类定义是在与您想要的类名称完全相同的文件中创建时,这才会起作用。
因为这是常见的情况,上面的答案应该做的大多数情况下。但在某些特殊情况下,你可能需要想出一个不同的解决方案。
如果你需要类(文件)本身的类名,你可以简单地使用这一行:
let className = __FILE__.lastPathComponent.stringByDeletingPathExtension
也许这个方法能帮助到一些人。