如何判断 Swift 中实例变量的类是啥
Posted
技术标签:
【中文标题】如何判断 Swift 中实例变量的类是啥【英文标题】:How can I tell what the class of an instance variable is in Swift如何判断 Swift 中实例变量的类是什么 【发布时间】:2014-06-07 23:59:37 【问题描述】:有没有什么简单的方法可以告诉 Swift 中的实例变量 class
是什么?在我习惯的基于 JVM 的语言中,您可以执行 println(value.class)
之类的操作来获取它的类。
在 Swift 中有没有等价的东西?
我在文档中能找到的最接近的东西是使用 is <Class>
keyword 进行“类型检查”的能力,但这只能帮助我猜测一点。
我在玩耍时遇到了few situations,我以为我有一种类型的课程,但实际上有另一种类型并且不知道如何确定。
【问题讨论】:
How to get the class of a variable in Swift? 的可能副本 谢谢大卫,我在搜索中没有看到那个。这是一个类似的问题,但不完全相同。那是在询问如何测试一个类是否是特定类型(使用is
,我在上面提到过)。我不想测试,我想打印出类名,这样我就可以看到它是什么了。
【参考方案1】:
使用type.self
返回一个可以传递给接受类型级参数的方法的类型。例如,UILabel.self
可以传递给isKindOfClass
方法调用。类的字符串表示可以通过dynamicType.description()
找到:
var label = UILabel()
println(label.dynamicType.description())
println(label.isKindOfClass(UILabel.self))
Swift-3
var label = UILabel()
println(type(of: label).description())
输出UILabel真
这里有一点背景知识——有两个表达式需要注意:后缀自我表达式和动态类型表达式。来自the docs:
后缀自我 后缀自表达由一个表达式或一个 类型,紧随其后的是 .self。它有以下几种形式:
expression.self type.self
第一种形式的计算结果为表达式的值。例如, x.self 计算结果为 x。
第二种形式计算类型的值。使用此表格 访问类型作为值。例如,因为 SomeClass.self 评估为 SomeClass 类型本身,您可以将其传递给函数 或接受类型级参数的方法
动态类型表达式 dynamicType 表达式由一个表达式组成,立即 其次是.dynamicType。它具有以下形式:
expression.dynamicType
表达式不能是类型的名称。整个动态类型 表达式计算为运行时类型的值 表达。
【讨论】:
我在测试用例上没有看到description()
let list:String[] = ["foo", "bar", "baz"]; let cdr = list[1..2]; println(cdr.dynamicType.description());
但我得到的错误 (error: 'Slice<String>.Type' does not have a member named 'description'
) 为我提供了我需要的信息我将其标记为正确,谢谢!
@TedNaleid 是的。有些类设置了描述函数,有些则没有。该语言还处于早期阶段,我希望将来会有更好的反射支持。
@TedNaleid: description()
被声明为NSObject
的类方法,这意味着您只能在编译时类型为NSObject
子类的表达式上使用.dynamicType.description()
。 cdr
的类型为Slice<String>
,它甚至不是一个类,更不用说NSObject
的子类了。
@newacct 不仅NSObject
子类可以具有description
属性。任何符合printable
协议的对象都会拥有它。
@MichaelG.Emmons:你混淆了两个不同的东西。符合Printable
的对象有一个description
property,即您可以以.description
访问它。这不是这里发生的事情。在这里,您正在调用 方法 .description()
。这个方法是一个类方法,所以它是在代表NSObject子类的类型(不是对象)上调用的。 类型不符合Printable
。两者不兼容,因为如果您尝试将方法作为属性访问,则会得到一个函数。【参考方案2】:
从 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 有助于破译这些字符串:
例如_TtSi
代表 Swift 内部的 Int
类型。
Mike Ash has a great blog entry covering the same topic.
【讨论】:
我收到一个错误:use of unsolved identifier _stdlib_getTypeName
以上是关于如何判断 Swift 中实例变量的类是啥的主要内容,如果未能解决你的问题,请参考以下文章