当前位置: 首页 > 面试题库 >

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

堵雅健
2023-03-14
问题内容

下面的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时,该类型ClassAnyClass!在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
没有 一个对象。您的错误消息表明确实selftype 而不是object。

self如果此代码在 类方法中 运行,则为type 。您应该为代码提供真正的上下文(显然,您并没有把它放在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书,但是找不到@synchronized的Swift版本。如何在Swift中进行互斥? 问题答案: 您可以使用GCD。它比更加冗长,但可以代替:

  • 问题内容: 我想知道它们是否在JAVA的方法“ BeanUtils.CopyProperties(bean1,Bean2);”的目标C中具有等效项。? 或其他解决方案,我想将motherObject强制转换为childObject: 在第一个测试中,它可以正常工作,但是我有一个警告:“不兼容的指针类型返回…”; 我使用WSDL2Objc并生成Bean,并且其名称可以在2代之间更改:-/ 我更喜欢与

  • 问题内容: 在Swift中,以下Objective-C代码等效于什么? 具体来说,如何在Swift中声明一个变量以使用自定义名称来合成getter? 此外,您随后如何覆盖getter和setter的实现? 问题答案: 您的假设很接近,但是有些事情可以更改。我将尽力帮助您尽可能接近Objective-C版本。 首先,和无关紧要。那让我们 由于swift中的属性只是实例变量,因此swift转换如下。

  • 问题内容: 用Java 最接近Objective-C的实现是什么?对我来说,看起来像,但是我对Objective-C还是很陌生。 谢谢 问题答案: 是一个类集群(请参阅《可可基础指南》中的“类集群”部分),这意味着实际的实现对您(API用户)是隐藏的。实际上,Foundation框架将在运行时根据数据量等选择适当的实现。此外,可以将任何一个作为键,而不仅是(当然,键对象的键必须是常量)。 因此,最

  • 我搜了Swift的书,找不到@同步的Swift版本,请问在Swift中如何进行互斥?

  • 问题内容: 在Swift中,转义的闭包参数用注释。在Objective- C中是否有任何等效项,以便将生成的Swift接口标记为? 问题答案: 是的,但是从您在问题中提出的建议来看是落后的。规则是,除非明确标记,否则Objective-C不可为空的块会 自动 转换为Swift作为函数。 __