是否有一种方法可以在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!
当使用Cocoa(而不是CocoaTouch)时,你可以为NSObject的子类对象使用className属性。
println(now.className)
这个属性对于普通的Swift对象是不可用的,它不是NSObject的子类(事实上,在Swift中没有根id或对象类型)。
class Person {
var name: String?
}
var p = Person()
println(person.className) // <- Compiler error
在CocoaTouch中,此时没有办法获得给定变量类型的字符串描述。类似的功能在Cocoa或CocoaTouch中也不存在。
Swift REPL能够打印出值的摘要,包括它的类型,所以这种内省方式可能在未来通过API实现。
编辑:转储(对象)似乎做的把戏。
编辑:在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。
我目前的Xcode版本是6.0 (6A280e)。
import Foundation
class Person { var name: String; init(name: String) { self.name = name }}
class Patient: Person {}
class Doctor: Person {}
var variables:[Any] = [
5,
7.5,
true,
"maple",
Person(name:"Sarah"),
Patient(name:"Pat"),
Doctor(name:"Sandy")
]
for variable in variables {
let typeLongName = _stdlib_getDemangledTypeName(variable)
let tokens = split(typeLongName, { $0 == "." })
if let typeName = tokens.last {
println("Variable \(variable) is of Type \(typeName).")
}
}
输出:
Variable 5 is of Type Int.
Variable 7.5 is of Type Double.
Variable true is of Type Bool.
Variable maple is of Type String.
Variable Swift001.Person is of Type Person.
Variable Swift001.Patient is of Type Patient.
Variable Swift001.Doctor is of Type Doctor.
当使用Cocoa(而不是CocoaTouch)时,你可以为NSObject的子类对象使用className属性。
println(now.className)
这个属性对于普通的Swift对象是不可用的,它不是NSObject的子类(事实上,在Swift中没有根id或对象类型)。
class Person {
var name: String?
}
var p = Person()
println(person.className) // <- Compiler error
在CocoaTouch中,此时没有办法获得给定变量类型的字符串描述。类似的功能在Cocoa或CocoaTouch中也不存在。
Swift REPL能够打印出值的摘要,包括它的类型,所以这种内省方式可能在未来通过API实现。
编辑:转储(对象)似乎做的把戏。