如何判断 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 中实例变量的类是啥的主要内容,如果未能解决你的问题,请参考以下文章

Swift无法使用类型(实例)访问类中的静态变量

java中说的属性是啥

如何在 Obj-C 或 Swift 中访问私有实例变量?

如何做到类的线程安全

如何在 Swift 子类中引用目标 c 实例变量?

C++只能实例化1个对象的类