Swift 3:是否继承NSObject?

我已经阅读了一些像 this one这样的帖子,关于在Swift中继承NSObject之间的区别,或者只是让它的本机基类没有子类化.但他们都有点旧帖,我不清楚这个话题.

你什么时候应该继承NSObject?子类化和非子类化之间的实际区别是什么?目前Swift的推荐是什么?

Apple’s documentation about NSObject声明以下内容

NSObject is the root class of most Objective-C class hierarchies. Through NSObject,objects inherit a basic interface to the runtime system and the ability to behave as Objective-C objects.

正如这表明的那样,只要该类型的实例需要像Objective-C对象(或类本身,在某些更罕见的情况下)那样,您需要为代码中引入的类型继承NSObject.

我不知道超级明确的Apple提供了关于何时不继承NSObject的书面指导,超过suggesting reducing dynamic dispatch或使用不依赖于子类化而是使用protocol extensions代码重用范例,即代码重用通常是更静态的调度和value type友好的代码重用.我相信尽管大多数Swift程序员已经从Apple获得了提示,并且Swift语言功能作为避免在上述需求不存在的情况下引入基于NSObject的类型的标志.也就是说,作为一般规则,当您实际需要Objective-C动态时,仅引入基于NSObject的类型,最常见的是当您需要与Cocoa API接口时(特别是当您的代码与UI相关时:例如视图控制器,视图).

尽管Swift类中的方法也是虚拟的,但是当您没有使用@objc属性明确标记方法时,编译器能够使用更快的方法调度方法 – 尤其是在Whole Module Optimization is toggled on时,以及在classes are not by default open for subclassing beyond the module that defines the type的Swift 3中更是如此.

除了避免使用NSObject之外,您还可以在编写Swift时完全避免使用基于类的引用类型in many cases.例如,查看上面链接的值类型WWDC视频,或者例如this blog post作为介绍.简而言之,使用值类型可以获得良好的局部推理,通常可以避免动态内存分配和引用计数开销(尽管不是普遍这样 – 带有引用类型的结构,因为字段是警告).

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...