swift:等价的objective-c运行时类
下面的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)
注意:find这个post,但没有帮助。
首先,很难将该代码翻译成Swift而不知道在Objective-C中使用了哪个类对象。
在Objective-C中,类对象是对象, Class
可以包含指向任何类对象的指针。 但是,当Objective-C API桥接到Swift时,typesClass
将转换为AnyClass!
在Swift中, AnyClass
被定义为AnyObject.Type
。 Swift中的types不是对象,因此并不直接等同于Objective-C中的类对象。 但是,如果您打算使用Swift中的Objective-C API,则无论如何它都将被桥接以期待AnyClass
,所以您必须传递一个types。 您可以使用.dynamicType
获取任何expression式的types; 例如:
self.dynamicType
(如果你真的想像在Objective-C中一样将类对象作为一个Swift对象,而不是Swifttypes,那么也有一些复杂的方法来做到这一点。)
然而,你的问题的描述揭示了另一个问题。 如果你只是想获得一个对象的types,而self
是一个对象,那么var klass: AnyClass = object_getClass(self)
应该已经工作了,因为object_getClass()
接受一个AnyObject
并返回一个AnyClass
。 它不工作的唯一解释是如果self
不是一个对象。 你的错误信息显示出, self
是一种types ,而不是一种对象。
如果此代码在类方法中运行,则self
是一个types。 你应该真的给你的代码上下文(显然,你没有把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
var klass: AnyClass = object_getClass(self) NSStringFromClass(klass)
在Swift 3中, self.dynamicType
(和一般的dynamicType
)已被删除。
您现在使用:
type(of: self)
- 如何正确使用多级段来显示uitableview内部的嵌套数组数据
- 如何基于CKQueryNotification知道要删除的实体?
- Swift Optionals – 不同的展开方式
- 以编程方式使用Swift自定义UITableViewCell
- ios – Swift – dequeueReusableCellWithReuseIdentifier,collectionViewController的单元格(在UIView中)滚动后不会加载
- 在swift中创build一个viewcontroller的单例
- iOS 9方向自动旋转animation不工作,但始终在主线程
- 如何从模拟器(IOS)获取Iphonetypes
- 等待asynchronous请求结果