下面的Objective-C代码等效于Swift代码。我找不到带有运行时概念的快速主题。
#import <objc/runtime.h> Class class = [self class];
试图获取类的对象self?
self
更新: 尝试以下代码,出现错误'UIViewController.type' doesn't conform to protocol 'AnyObject'
'UIViewController.type' doesn't conform to protocol 'AnyObject'
var klass: AnyClass = object_getClass(self)
首先,在不知道您在Objective-C中使用该类对象的目的的情况下,很难将该代码转换为Swift。
在Objective-C中,类对象是对象,并且类型Class可以保存指向任何类对象的指针。但是,当将Objective-C API桥接到Swift时,该类型Class将AnyClass!在Swift中转换为,其AnyClass定义为AnyObject.Type。Swift中的类型不是对象,因此不直接等同于Objective- C中的类对象。但是,如果您打算使用Swift中的Objective-C API,AnyClass无论如何它都会被桥接,因此您必须传递一个类型。您可以使用来获取任何表达式的类型.dynamicType。例如:
Class
AnyClass!
AnyClass
AnyObject.Type
.dynamicType
self.dynamicType
(如果您真的想以与Objective- C中相同的方式将类对象作为Swift对象而不是Swift类型,则也有一些复杂的方法可以做到这一点。)
但是,您对问题的描述揭示了另一个问题。如果您只是想获取一个对象的类型,并且self是一个对象,那么var klass: AnyClass = object_getClass(self)应该已经可以使用了,因为object_getClass()需要一个AnyObject并返回一个AnyClass。它不工作,唯一的解释是,如果self是 没有 一个对象。您的错误消息表明确实self是 type 而不是object。
object_getClass()
AnyObject
self如果此代码在 类方法中 运行,则为type 。您应该为代码提供真正的上下文(显然,您并没有把它放在Class class = [self class];文件的顶层),因为从上下文中删除很容易造成误解。在Objective-C Cocoa中,有 两种 非常不同的方法,它们分别是class:实例方法(-class返回对象的类)和类方法(+class仅返回被调用的(类)对象)。由于您的代码在类方法中,因此在Objective- C中self指向一个类对象,然后[self class]运行该类方法+class,该方法只返回被调用的对象。换句话说,[self class]与完全相同self。你应该刚写self 一直以来,但没有意识到。
Class class = [self class];
class
-class
+class
[self class]
所以答案是,Objective-C应该是
Class class = self;
同样,Swift应该是
var klass: AnyClass = self