背景
我们写一个类或者协议的时候经常会继承一个基类,然而什么时候该继承哪个基类呢,OC 与Swift 的基类又有哪些区别和联系呢,今天带大家看看这几个基础的知识。
AnyObject与NSObject
AnyObject
首先我们看看Swift里的AnyObject:
AnyObject是 Swift对Objective-C id类型的表示.它比NSObject更通用(即每个NSObject都 是AnyObject,但不是每个AnyObject都是NSObject).
是什么
类型别名
定义
所有类隐式遵守的协议
用处
需要没有明确类型的灵活对象或桥接返回非明确类型结果的 Objective-C 方法和属性时,可以使用 AnyObject。AnyObject 可以用作任何类实例、类或仅用于类的协议。
AnyObject 还可以用作桥接到 Objective-C 类的类型实例的具体类型。Swift 中的许多值类型会桥接到 Objective-C 对应项,如 String 和 Int
let s: AnyObject = "This is a bridged string." as NSString
print(s is NSString)
// Prints "true"
AnyObject协议的灵活行为类似于Objective-C的id类型。因此,导入的 Objective-C 类型经常使用 AnyObject 作为属性、方法参数和返回值的类型。
NSObject
NSObject是所有 Objective-C 对象的基础方法组。
是什么
是一个类
定义
大多数 Objective-C 类层次结构的根类,子类从中继承到运行时系统的基本接口以及作为 Objective-C 对象运行的能力。
重点:
它以 NSObjectProtocol 的名称导入到 Swift 中。换言之,Cocoa 根类 NSObject 采用NSObjectProtocol 协议,因此从 NSObject 继承的所有对象都具有此协议所描述的功能。
用处
符合此协议的对象可以被视为一级对象。这样的对象可以查询一下的信息:
- 它的类型,以及其类在继承层次结构中的位置。
- 是否符合某个协议。
- 能够响应特定消息。
总结
当我们在swift里要处理OC的id类型的参数或者返回值,亦或我们要实现一个只有类可以遵循的协议的时候要用AnyObject。在Swift里如果要继承NSObject的RunTime等特性时候,需要使用NSObjectProtocol它就是NSObject的Swift导入名称。这么一看大家就知道平时该怎么用了。