有没有简单的方法来告诉Swift中的class
实例变量是什么?在我习惯的基于JVM的语言中,您可以执行类似println(value.class)
的操作来获取它的类。
Swift中有相同的东西吗?
我在文档中找到的最接近的东西是能够使用is <Class>
keyword进行“类型检查”,但这只能帮我猜一点。
我遇到few situations在我认为我有一种类型的地方玩,但实际上有另一种类型,并且不知道如何确定。
答案 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
类型。