【问题标题】:swift: Equivalent objective-c runtime classswift:等效的objective-c运行时类
【发布时间】:2014-08-15 17:22:50
【问题描述】:

以下 Objective-C 代码的等效 swift 代码是什么。我找不到带有运行时概念的 swift 主题。

#import <objc/runtime.h>    
Class class = [self class];

试图获取self 的类对象?

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

var klass: AnyClass = object_getClass(self)

注意:找到了this post,,但没有帮助。

【问题讨论】:

  • class 是 Swift 中的保留关键字。大多数功能都可以从对象本身使用。 AnyObject 比 NSObject 有更多的功能。例如,现在可以从对象访问版本属性,而不是先获取类然后再获取版本。那么你想用它做什么呢?
  • 这不是重复的。读者必须仔细阅读问题。

标签: ios swift objective-c-runtime


【解决方案1】:
var klass: AnyClass = object_getClass(self)
NSStringFromClass(klass)

【讨论】:

  • 是返回类吗?还是 NSString?
  • Swift中没有Class类型,只有AnyObject,所以只能获取类名(typealias AnyClass = AnyObject.Type)
  • K 我接受此声明There is not Class type in Swift,但即使此声明正确,上述答案也不正确。
  • object_getClass(self)
  • 你试过了吗?我收到错误'UIViewController.type' doesn't conform to protocol 'AnyObject'
【解决方案2】:

首先,如果不知道您在 Objective-C 中使用该类对象做什么,就很难将该代码翻译成 Swift。

在 Objective-C 中,类对象是对象,Class 类型可以保存指向任何类对象的指针。但是,当 Objective-C API 桥接到 Swift 时,Class 类型在 Swift 中被转换为 AnyClass!,其中 AnyClass 定义为 AnyObject.Type。 Swift 中的类型不是对象,因此不直接等同于 Objective-C 中的类对象。但是,如果您打算使用 Swift 的 Objective-C API,无论如何它都会被桥接为期望 AnyClass,因此您必须传递一个类型。您可以使用.dynamicType 获取任何表达式的类型;例如:

self.dynamicType

(如果你真的想像在 Objective-C 中一样将类对象作为 Swift 对象,而不是作为 Swift 类型,也有一些 convoluted ways 可以做到这一点。)

但是,您对问题的描述揭示了另一个问题。如果您只想获取对象的类型,而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

【讨论】:

    【解决方案3】:

    在 Swift 3 中,self.dynamicType(和一般的dynamicType)已被删除。

    你现在使用:

    type(of: self)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-26
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多