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)
在Swift 3中,self.dynamicType
(和dynamicType
一般情况下)已被删除.
你现在使用:
type(of: self)
Run Code Online (Sandbox Code Playgroud)
var klass: AnyClass = object_getClass(self)
NSStringFromClass(klass)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
21669 次 |
最近记录: |