Swift 学习笔记 [4] 类 多态和封装、协议、扩展、内存管理

来源:互联网 发布:软件设计方案作用 编辑:程序博客网 时间:2024/05/17 06:16

多态概念

编译时: 在编译时确定的,编译器只认编译时类型
运行时: 实际赋值的实例决定
相同类型的变量,调用同一个方法时呈现不同的行为特征,就叫多态

向下转换

向下转换是为了解决这个问题: 编译器只认编译时,所以要强制转换为正确的类型。

  1. is运算符: 在强制类型转换之前,首先判断一个引用变量是否可以成功转换
  2. as运算符向下转型
  3. as 编译时就能确定
  4. as? as! 可选形式的向下转换

Any 可代表任何类型,包括Int 基础值类型
AnyObject 可代表任何类的实例
嵌套类型

扩展功能

  • 添加类型存储
  • 添加实例计算属性和类型计算属性
  • 添加实例方法和类型方法
  • 添加新构造器
  • 添加下表
  • 定义和使用新的嵌套类型

注意
1. 使一个已有类型符合一个或者多个协议
2. 不能添加实例存储属性
3. 通过扩展可变方法可以改变值类型的实例方法

协议

  • 统一了属性名、方法名和下表
  • 协议名一般用形容词
  • 一个协议可以有多个直接父类协议,协议只能继承协议
  • 协议内容指协议是闲者必须实现功能: 属性、方法、构造器、下标

注意

  1. 实现类可以采用存储属性和计算属性来实现协议要求的属性
  2. 可变、费可变方法均可实现协议的可变方法,但只有非可变方法才能实现协议中的非可变方法。
  3. 使用类实现协议,必须用required 修饰该构造器, 除非使用final 修饰,可省略require
  4. 如果实现协议的构造,同时重写了父类的构造器,则必须同时使用required override。

协议用途

协议相当于一个彻底抽象的类型,可做以下用途:

  • 使用协议声明变量
  • 使用协议作为函数、方法、构造器的形参类型、返回值类型
  • 协议作为泛型参数,如制定数组 字典的元素类型
  • 协议作为 is as as? as! 运算符最后一个操作数
  • 在实现某个协议时,和继承某个父类的本质一样,协议实现类型的实例,完全可以当成协议实例来使用
  • 变相协议变成,就像其他语言的面向接口变成一样,提供非常好的灵活性,这是多态的价值所在

特殊用法

  1. 合成协议把多个协议当成一个使用
    protocol <协议1, 协议2, 协议3, …>
  2. 通过扩展为已有的类型添加协议
  3. Class-Only协议 也叫唯类协议, 不可被非类使用
    protocol 协议名 : class , 协议1, 协议2, …
  4. 可选协议
    可选协议是为了兼容Objective-C的,所以要@objc 修饰, 同时只能被类使用,所以他是 Class-Only协议
    用 optional 修饰属性、下表、方法等
  5. 协议扩展
    针对协议进行拓展,给实现该协议的类型都可以使用协议扩展的属性、方法和下表
  6. CustomStringConvertible协议
    实现description方法,和Objective-C的description方法一致

  7. Hashable协议 是 Equatable 的子协议
    Hashable 重载 == 运算符
    Equatable 重载hashValue 方法

封装

模块:单独应用、框架就是一个模块
public 可被任意模块和文件使用
internal 默认,同一模块可使用
private 仅在当前源文件使用

在测试时,import中添加 @testable 修饰,保证测试target可以访问所有internal实体

访问最高准则,所有实体只能指定比他所依赖的实体更低或者相等的访问权限。
规则

  • Swift是强类型的语言,但是默认权限均为internal, 如果被依赖的实体更低,则要显示地把实体申明为更低,也就是private。 以免编译错误
  • 元祖的访问权限是所有成员类型的最低级别
  • 子类权限不高于父类权限
  • 函数权限不高于参数和返回值权限
  • 子类可以重载重现暴露父类的private权限
  • 协议成员和协议总是具有相同的访问权限

内存管理

  • Swift 使用ARC管理内存
  • Swift 内存引用循环: 相互引用、 闭包对象相互引用
  • 使用弱引用 weak 或者无主引用 unowned
  • 当总是相互引用,且同时销毁,应当申明为无主引用,而当引用可能会为nil时,使用弱引用
0 0