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

时间:2014-06-25 08:27:55

标签: ios swift objective-c-runtime

以下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,,但没有帮助。

3 个答案:

答案 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)