繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM