以下Objective-C代码的等效swift代码。我找不到运行时概念的快速话题。
#import <objc/runtime.h>
Class class = [self class];
尝试获取self
的类对象?
更新
尝试使用以下代码,得到错误'UIViewController.type' doesn't conform to protocol 'AnyObject'
var klass: AnyClass = object_getClass(self)
注意:找到this post,,但没有帮助。
答案 0 :(得分:47)
首先,如果不知道在Objective-C中使用了什么类对象,很难将代码转换为Swift。
在Objective-C中,类对象是对象,类型Class
可以包含指向任何类对象的指针。但是,当Objective-C API桥接到Swift时,类型Class
在Swift中转换为AnyClass!
,其中AnyClass
定义为AnyObject.Type
。 Swift中的类型不是对象,因此不直接等同于Objective-C中的类对象。但是,如果您打算使用Swift的Objective-C API,那么无论如何它都会被桥接到期望AnyClass
,因此您必须传递一个类型。您可以使用.dynamicType
获取任何表达式的类型;例如:
self.dynamicType
(如果你真的想以类似于Objective-C的方式获取类对象作为Swift对象,而不是作为Swift类型,那么也有一些convoluted ways也可以这样做。)
但是,您对问题的描述会显示另一个问题。如果您只想获取对象的类型,而self
是一个对象,则var klass: AnyClass = object_getClass(self)
应该有效,因为object_getClass()
需要AnyObject
并返回{{ 1}}。它不起作用的唯一解释是,如果AnyClass
不是一个对象。您的错误消息显示,self
确实是类型,而不是对象。
self
是一种类型。您应该已经为代码提供了上下文(显然,您没有将self
放在文件的顶层),因为脱离上下文很容易产生误解。在Objective-C Cocoa中,有两个非常不同的方法,名为Class class = [self class];
:一个实例方法,class
,它返回对象的类,以及一个类方法,{ {1}},它只返回它所调用的(类)对象。由于您的代码是在类方法中,因此在Objective-C中,-class
指向一个类对象,而+class
运行类方法self
,它只返回它所调用的对象。换句话说,[self class]
与+class
完全相同。你应该一直写[self class]
,但没有意识到。
所以答案是Objective-C应该是
self
同样,Swift应该是
self
答案 1 :(得分:7)
在Swift 3中,self.dynamicType
(以及一般dynamicType
)已被删除。
您现在使用:
type(of: self)
答案 2 :(得分:5)
var klass: AnyClass = object_getClass(self)
NSStringFromClass(klass)