继承
继承的特点
- 单继承,每个子类只有一个直接父类,可以有多个间接父类. 与OC不同,他不继承NSObject。如果不显示父类,就说明没有父类。
- 子类继承父类,可以获得父类的属性,方法,下标,也可以进行重写
- swift的类并不是从一个通用的基类继承而来的
- override修饰被重写的部分
- final修饰的类不能被继承,属性,方法和下标不能被重写
父类的继承
1 | class Fruit { |
重写父类的方法
1 | class Bird{ |
重写父类的属性
1 | class Bird { |
重写属性观察者
- 不要同时添加set和didSet,因为在didSet里就可以改变属性的值
- 不要给常量存储属性和只读计算属性添加属性观察者,因为值是不会变的,观察者又有什么用
1 | class Bird { |
重写父类的下标
1 | class Base { |
多态
- Swift引用变量有两个类型:编译时类型,运行时类型,编译器只认编译时类型
- 编译时类型由声明该变量时使用类型决定,编译器只认变量的编译类型
- 运行时类型由实际赋予该变量的实例决定
- 多态:相同类型的变量,调用同一个方法时呈现出多种不同的行为特征。也就是编译时类型和运行时类型不一样
1 | class BaseClass { |
运算符检查类型 (变量 is 类)
- 使用is运算符检查类型,返回值为布尔类型,判断前面的引用变量是否引用后面的类或者子类的实例。是则true
- 前一个操作数是一个引用类型变量,后一个操作数是一个类
- 运算符前面操作数的编译类型要么与后面的类相同,要么具有继承关系,否则编译报错。
1 | //定义一个可被objective-C类使用的协议 |
转型
向上转型
将子类实例赋值给父类变量,称为向上转型,由系统自动完成1
2//编译类型是BaseClass,运行时类型是SubClass
let ploymophicBc: BaseClass = SubClass()
向下转型 (父类的对象 as! 子类)
- 使用as运算符向下转型.
- 向上转型:把一个子类实例直接赋给一个父类引用变量,不用任何类型转换
- 引用变量只能调用其编译时类型的方法,强制转换为其实际类型,可以调用运行时类型的方法,这种强制转换为向下转型
- 向下转型运算符: 1. as!强制将运算符前面的引用变量转换为后面的类型。 2.(a..as?…b)!可选形式的向下转换
- 向下转换只能在具有继承关系的两个类型之间进行
例子1
1 | //编译类型为NSObject的obj向下转换,程序可以运行 |
例子2
1 | class Fruit { |
Any和AnyObject
- AnyObject: 可代表任何类的实例
- Any: 可代表任何类型,包括Int,Double等值类型,AnyObject修饰的实例
嵌套类型
- 在一个类型的内部定义另一个类型
- Swift的枚举、类,结构体都可以定义嵌套类型
- Swift的嵌套类型支持多级嵌套
- 嵌套类型不允许使用static或者class修饰
1 | class User { |
总结
- 继承的特点,一个直接,多个间接,不写则无,不继承NSObject
- 因为继承,所以可以重写属性,在重写属性中添加观察者,重写方法,下标,使用override,如果要不被重写,使用final
- 多态,就是编译类型和运行类型不同,例如左侧变量属性是父类,右侧赋值是子类对象。
- 向上转型:父类变量赋予子类的值,执行子类的方法,前提是该父类的方法被override
- 向下转型:(父类的对象 as! 子类),只能在具有继承关系的两个类型之间进行,转换前最好先进行is判断