[英]swift: Equivalent objective-c runtime class
什么是以下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)
注意:找到这篇文章,但没有帮助。
首先,如果不知道在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
获取任何表达式的类型; 例如:
self.dynamicType
(如果你真的想以类似于Objective-C的方式获取类对象作为Swift对象,而不是作为Swift类型,那么也有一些复杂的方法可以做到这一点。)
但是,您对问题的描述会显示另一个问题。 如果你只想获取一个对象的类型,而self
是一个对象,则var klass: AnyClass = object_getClass(self)
应该有效,因为object_getClass()
接受一个AnyObject
并返回一个AnyClass
。 它不起作用的唯一解释是,如果self
不是一个对象。 您的错误消息显示,确实, self
是一种类型 ,而不是一个对象。
如果此代码在类方法中运行,则self
是一种类型。 你应该真的为你的代码提供了上下文(显然,你没有把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
在Swift 3中, self.dynamicType
(和一般的dynamicType
)已被删除。
你现在使用:
type(of: self)
var klass: AnyClass = object_getClass(self)
NSStringFromClass(klass)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.