一尘不染

swift:等效的objective-c运行时类

swift

下面的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)

阅读 225

收藏
2020-07-07

共1个答案

一尘不染

首先,在不知道您在Objective-C中使用该类对象的目的的情况下,很难将该代码转换为Swift。

在Objective-C中,类对象是对象,并且类型Class可以保存指向任何类对象的指针。但是,当将Objective-C
API桥接到Swift时,该类型ClassAnyClass!在Swift中转换为,其AnyClass定义为AnyObject.Type。Swift中的类型不是对象,因此不直接等同于Objective-
C中的类对象。但是,如果您打算使用Swift中的Objective-C
API,AnyClass无论如何它都会被桥接,因此您必须传递一个类型。您可以使用来获取任何表达式的类型.dynamicType。例如:

self.dynamicType

(如果您真的想以与Objective-
C中相同的方式将类对象作为Swift对象而不是Swift类型,则也有一些复杂的方法可以做到这一点。)

但是,您对问题的描述揭示了另一个问题。如果您只是想获取一个对象的类型,并且self是一个对象,那么var klass: AnyClass = object_getClass(self)应该已经可以使用了,因为object_getClass()需要一个AnyObject并返回一个AnyClass。它不工作,唯一的解释是,如果self
没有 一个对象。您的错误消息表明确实selftype 而不是object。

self如果此代码在 类方法中 运行,则为type 。您应该为代码提供真正的上下文(显然,您并没有把它放在Class class = [self class];文件的顶层),因为从上下文中删除很容易造成误解。在Objective-C Cocoa中,有 两种
非常不同的方法,它们分别是class:实例方法(-class返回对象的类)和类方法(+class仅返回被调用的(类)对象)。由于您的代码在类方法中,因此在Objective-
C中self指向一个类对象,然后[self class]运行该类方法+class,该方法只返回被调用的对象。换句话说,[self class]与完全相同self。你应该刚写self 一直以来,但没有意识到。

所以答案是,Objective-C应该是

Class class = self;

同样,Swift应该是

var klass: AnyClass = self
2020-07-07