Swift 3:是否子类化NSObject?

Swift 3:是否子类化NSObject?,swift,class,inheritance,subclass,nsobject,Swift,Class,Inheritance,Subclass,Nsobject,我读过一些帖子,比如关于在Swift中子类化NSObject与只使用其原生基class而不使用子类化之间的区别。但它们都是一些老帖子,我不清楚这个话题 什么时候应该将NSObject子类化?子类化和不子类化之间的实际区别是什么?Swift中目前的建议是什么?将以下内容作为介绍: NSObject是大多数Objective-C类层次结构的根类。通过NSObject,对象继承了运行时系统的基本接口以及作为Objective-C对象的能力 这表明,只要代码中引入的类型的实例需要表现得像Objectiv

我读过一些帖子,比如关于在Swift中子类化
NSObject
与只使用其原生基
class
而不使用子类化之间的区别。但它们都是一些老帖子,我不清楚这个话题

什么时候应该将NSObject子类化?子类化和不子类化之间的实际区别是什么?Swift中目前的建议是什么?

将以下内容作为介绍:

NSObject是大多数Objective-C类层次结构的根类。通过NSObject,对象继承了运行时系统的基本接口以及作为Objective-C对象的能力

这表明,只要代码中引入的类型的实例需要表现得像Objective-C对象(或者在某些罕见的情况下是类本身),就需要将该类型的NSObject子类化

我不知道超级显式Apple提供了关于何时不将NSObject子类化的书面指导,超越或呈现不依赖子类化的代码重用范例,即通常更静态和友好的代码重用)。不过,我相信可以公平地说,大多数Swift程序员都从苹果那里得到了一些提示,并将Swift语言特性作为避免在没有上述需求的情况下引入基于NSObject的类型的标志也就是说,作为一般规则,只有当您实际需要Objective-C动态时,才引入基于NSObject的类型,最常见的是当您需要与Cocoa API接口时(尤其是当您的代码与UI相关时,例如视图控制器、视图)。

,具有Objective-C风格的活力。尽管Swift类中的方法也是虚拟的,但当您不使用
@objc
属性显式标记方法时,编译器能够使用更快的方法调度方法,尤其是在Swift 3中,更是如此


除了避免NSObject之外,在编写Swift时还可以完全避免基于类的引用类型。例如,查看上面链接的值类型WWDC视频,或者作为介绍。简单地说,使用值类型可以获得良好的局部推理,通常可以避免动态内存分配和引用计数开销(尽管并非普遍如此——以引用类型作为字段的结构是警告)。

将NSObject子类化的一个原因是,如果需要保存一些数据。NSObject和它所包含的一切仍然是(AFAIK)获取NSCoding的最简单方法,您需要将NSCoding写入文件


可以找到一些见解或

另一种情况是,当您必须子类
NSObject
时,您希望您的子类成为KVO的观察者,即

addObserver(_ observer: NSObject, forKeyPath keyPath: String, options: NSKeyValueObservingOptions = [], context: UnsafeMutableRawPointer?)
要求观察者是
NSObject
(或数组或集合)