如何判断Swift中实例变量的类是什么

时间:2014-06-07 23:59:37

标签: swift

有没有简单的方法来告诉Swift中的class实例变量是什么?在我习惯的基于JVM的语言中,您可以执行类似println(value.class)的操作来获取它的类。

Swift中有相同的东西吗?

我在文档中找到的最接近的东西是能够使用is <Class> keyword进行“类型检查”,但这只能帮我猜一点。

我遇到few situations在我认为我有一种类型的地方玩,但实际上有另一种类型,并且不知道如何确定。

2 个答案:

答案 0 :(得分:25)

使用type.self返回可以传递给接受类型级参数的方法的类型。例如,UILabel.self可以传递给isKindOfClass方法调用。可以通过dynamicType.description()

找到该类的字符串表示形式
var label = UILabel()
println(label.dynamicType.description())
println(label.isKindOfClass(UILabel.self))

<强>夫特-3

var label = UILabel()
println(type(of: label).description())
  

输出
UILabel
确实

这里有更多背景知识 - 有两个表达式需要注意:后缀自表达式和动态类型表达式。来自the docs

  

Postfix Self
   后缀自表达式由表达式或a的名称组成   类型,紧接着.self。它有以下形式:

expression.self
type.self
     

第一个表单求值为表达式的值。例如,   x.self评估为x。

     

第二种形式评估为类型的值。使用此表单   将类型作为值访问。例如,因为SomeClass.self   评估SomeClass类型本身,您可以将它传递给函数   或接受类型级参数的方法

     



   Dyamic Type Expression
  dynamicType表达式立即由表达式组成   后跟.dynamicType。它具有以下形式:

expression.dynamicType
     

表达式不能是类型的名称。整个dynamicType   expression计算为的运行时类型的值   表达

答案 1 :(得分:6)

从beta 6 _stdlib_getTypeName获取变量的受损类型名称。将其粘贴到空的操场上:

import Foundation

class PureSwiftClass {
}

var myvar0 = NSString() // Objective-C class
var myvar1 = PureSwiftClass()
var myvar2 = 42
var myvar3 = "Hans"

println( "TypeName0 = \(_stdlib_getTypeName(myvar0))")
println( "TypeName1 = \(_stdlib_getTypeName(myvar1))")
println( "TypeName2 = \(_stdlib_getTypeName(myvar2))")
println( "TypeName3 = \(_stdlib_getTypeName(myvar3))")

输出结果为:

TypeName0 = NSString
TypeName1 = _TtC13__lldb_expr_014PureSwiftClass
TypeName2 = _TtSi
TypeName3 = _TtSS

Ewan Swick's blog entry有助于破译这些字符串:

e.g。 _TtSi代表Swift的内部Int类型。

Mike Ash has a great blog entry covering the same topic