使用Objective-C可以做的5件事,但是使用纯Swift却做不到

我喜欢使用Swift进行编程,就像喜欢使用Objective-C或Python或C#进行编程一样,因此,本文并非旨在偏爱这两种语言。 在以后的文章中,我将尝试介绍您可以使用Swift进行的操作,但是不能使用Objective-C进行的操作。

话虽这么说,但是在写了很长时间的Objective-C之后,有时用 Swift进行编程时似乎缺少一些工具,尽管通常有一些方法仅使用Swift就能获得大致相同的结果。 用Objective-C编写的许多应用程序和框架都依赖于这些工具,有时还依赖于骇客,这使我们的代码更简洁,更易于使用。 我将以可能是Objective-C中最具争议的主题开始我的列表。

1.)方法混乱

混乱是有争议的,因为它允许您通过更改类选择器的实现来在运行时更改类的行为。 这意味着您可能会拥有一项服务,该服务为您提供类名或方法名作为字符串,并更改应用程序在运行时的行为方式。 不能从NSObject继承而来的纯Swift类(我们想要转换为@dynamic缺乏此功能,但本质上动态性较低且类型安全的语言首先吸引了大多数Swift开发人员。

那里有许多Objective-C框架/库,它们使用方法混乱使我们的生活更轻松并且代码更简洁。
Aspects是一个功能强大的库,它使用复杂的特性使在Objective-C中实现面向方面的编程成为可能。 这使您能够为诸如应用程序分析之类的事情实现非侵入式代码,如另一个库ARAnalytics中所示。 OCMock在很大程度上依赖于Objective-C运行时,而Swift并没有真正支持它。
Rollout.io使用方法混乱,将实时更新推送到您的应用程序。 Rollout.io发生了一个有趣的发展,他们在其中描述了他们甚至如何使用Swift应用程序进行实时更新!

2.)C ++互操作

Objective-C通过名为Objective-C ++的结构支持与C ++代码的互操作性。 许多项目/库都使用C ++作为其核心组件,以便能够更快地交付该库的跨平台版本,而不是用平台的本地语言重写整个库。 PSPDFKit和Realm是很好的例子。
当然,您可以将C ++代码包装在C或Objective-C中,然后通过Swift与该代码对话,但这会增加代码量和代码库的维护量。

3.)performSelector:

performSelector:NSObject类的实例方法,该方法将指定的消息发送到接收方并返回消息的结果。 在这样的对象上进行方法调用会触发一系列事件,这些事件将调用objc_msgSend函数(在Swift中也不可用)。 如果该类的方法调用存在实现,则该函数进行查找,否则,将其链接到超类,直到到达NSObject的根级别为止,在该根级它将引发unrecognized selector sent to instance ,该unrecognized selector sent to instance NSInvalidArgumentException 。 这种机制使您可以在不预先知道对象类型的情况下向对象发送消息,如下所示:

 类personClass = NSClassFromString(@“ Person”); 
id object = [personClass new];
NSString * name = [对象performSelector:NSSelectorFromString(@“ name”)]];

例如,您可以使用此工具从Web服务中获取一些信息,然后根据响应通过解析要调用的选择器名称在应用程序中执行不同的代码路径。
不能从NSObject继承的纯Swift类不支持这种行为,这是有充分的理由的,因为它可能导致代码中不良后果。 适用于performSelector: Apple文档:

由于本质上缺乏类型安全性,因此不建议在Swift中使用此API,除非您的代码特别依赖由Objective-C运行时提供的动态方法解析。

例如,您可能不小心在要迭代的数组中添加了不需要的对象,并对该对象不符合的对象调用了选择器,这将引发NSException ,或者该对象的方法可能正在返回与您期望的类型不同,甚至为nil ,导致应用程序中不可预测的行为。

在Swift中也不可用的是NSInvocation ,它是命令模式的Cocoa实现,它允许您在对象之间以及应用程序之间存储和转发消息。

4.)KVO

键值观察提供了一种机制,该机制允许将对象的其他对象的特定属性的更改通知给对象,如Apple官方文档中所定义。 KVO是一种强大的机制,即使通过一个可怕的界面,它也使得观察状态变化确实非常容易实现。 同样,不从NSObject继承并具有标记为@dynamic可观察属性的纯Swift类缺少此功能。

但是,有许多开放源代码库可以帮助您实现这一目标。 像RxSwift和ReactiveCocoa这样的大多数反应式编程框架都在这里帮助它们自己的可观察构造,或者甚至可以构建自己的Observable类型。

5.)复杂宏

是由GCC社区定义的已命名名称的代码片段。 宏已经存在很长时间了,众所周知,它已用于诸如C和C ++之类的语言中。 但是在编写应用程序时,您将使用宏做什么?
您可以在用Objective-C编写的任何应用程序中找到的最简单的宏用法可能是不同的调试日志记录应用程序或ios版本号检查宏。
一些库(例如libextobjc)使用宏来扩展语言本身的功能,而其他一些库(例如Nimble)使用宏来创建特定于域的语言(DSL),以使API更加用户友好。
当然,所有这些功能在Swift中可能都是过时的,您可以在其中通过编写函数来创建漂亮的API。

最后

这不是最终列表,而是我根据自己的经验以及在以前和当前项目中经常使用的工具制作的列表。 如果发现任何错误,或对如何改进此列表有任何建议,请发表评论。

如果您喜欢这篇文章,请分享,关注或鼓掌😊

谢谢阅读!