当试图理解一个程序,或在某些角落的情况下,它是有用的,能够实际找出什么类型的东西。我知道调试器可以显示一些类型信息,你通常可以依靠类型推理去逃避在这些情况下不指定类型,但仍然,我真的想有一些像python的类型()
dynamicType(见this question)
更新:这已经在最近版本的Swift中更改,obj.dynamicType现在提供了对类型的引用,而不是具有动态类型的实例。
这个似乎是最有前途的,但到目前为止我还没有找到实际的类型
class MyClass { var count = 0 } let mc = MyClass() # update: this now evaluates as true mc.dynamicType === MyClass.self
我也尝试使用类引用来实例化一个新的对象,这是工作,但奇怪地给了我一个错误,说我必须添加一个必需的初始化:
作品:
class MyClass { var count = 0 required init() { } } let myClass2 = MyClass.self let mc2 = MyClass2()
仍然只有一小步,实际上发现任何给定的对象的类型
编辑:我删除了大量的现在不相关的详细信息 – 看看编辑历史,如果你有兴趣:)
在Swift 2.0中,做这种类型内省的正确方法是用
Mirror struct,
let stringObject:String = "testing" let stringArrayObject:[String] = ["one","two"] let viewObject = UIView() let anyObject:Any = "testing" let stringMirror = Mirror(reflecting: stringObject) let stringArrayMirror = Mirror(reflecting: stringArrayObject) let viewMirror = Mirror(reflecting: viewObject) let anyMirror = Mirror(reflecting: anyObject)
然后从Mirror结构体访问类型本身,你将使用属性subjectType像这样:
// Prints "String" print(stringMirror.subjectType) // Prints "Array<String>" print(stringArrayMirror.subjectType) // Prints "UIView" print(viewMirror.subjectType) // Prints "String" print(anyMirror.subjectType)
然后你可以使用这样的东西:
if anyMirror.subjectType == String.self { print("anyObject is a string!") } else { print("anyObject is not a string!") }