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

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

注意:find这个post,但没有帮助。

首先,很难将该代码翻译成Swift而不知道在Objective-C中使用了哪个类对象。

在Objective-C中,类对象是对象, Class可以包含指向任何类对象的指针。 但是,当Objective-C API桥接到Swift时,typesClass将转换为AnyClass! 在Swift中, AnyClass被定义为AnyObject.Type 。 Swift中的types不是对象,因此并不直接等同于Objective-C中的类对象。 但是,如果您打算使用Swift中的Objective-C API,则无论如何它都将被桥接以期待AnyClass ,所以您必须传递一个types。 您可以使用.dynamicType获取任何expression式的types; 例如:

 self.dynamicType 

(如果你真的想像在Objective-C中一样将类对象作为一个Swift对象,而不是Swifttypes,那么也有一些复杂的方法来做到这一点。)

然而,你的问题的描述揭示了另一个问题。 如果你只是想获得一个对象的types,而self是一个对象,那么var klass: AnyClass = object_getClass(self)应该已经工作了,因为object_getClass()接受一个AnyObject并返回一个AnyClass 。 它不工作的唯一解释是如果self 不是一个对象。 你的错误信息显示出, self是一种types ,而不是一种对象。

如果此代码在类方法中运行,则self是一个types。 你应该真的给你的代码上下文(显然,你没有把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 
 var klass: AnyClass = object_getClass(self) NSStringFromClass(klass) 

在Swift 3中, self.dynamicType (和一般的dynamicType )已被删除。

您现在使用:

 type(of: self)