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

Man*_*ani 33 objective-c-runtime ios swift

什么是以下Objective-C代码的等效swift代码.我无法找到运行时概念的快速主题.

#import <objc/runtime.h>    
Class class = [self class];
Run Code Online (Sandbox Code Playgroud)

试图获得类对象self

更新: 尝试使用以下代码,得到错误'UIViewController.type' doesn't conform to protocol 'AnyObject'

var klass: AnyClass = object_getClass(self)
Run Code Online (Sandbox Code Playgroud)

注意:找到这篇文章,但没有帮助.

new*_*cct 49

首先,如果不知道在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
Run Code Online (Sandbox Code Playgroud)

(如果你真的想以类似于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;
Run Code Online (Sandbox Code Playgroud)

同样,Swift应该是

var klass: AnyClass = self
Run Code Online (Sandbox Code Playgroud)


Daf*_*ams 7

在Swift 3中,self.dynamicType(和dynamicType一般情况下)已被删除.

你现在使用:

type(of: self)
Run Code Online (Sandbox Code Playgroud)


mie*_*tus 5

var klass: AnyClass = object_getClass(self)
NSStringFromClass(klass)
Run Code Online (Sandbox Code Playgroud)