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

    xiaoxiao2021-03-26  47

    多态概念

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

    向下转换

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

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

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

    扩展功能

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

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

    协议

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

    注意

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

    协议用途

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

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

    特殊用法

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

    CustomStringConvertible协议 实现description方法,和Objective-C的description方法一致

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

    封装

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

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

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

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

    内存管理

    Swift 使用ARC管理内存Swift 内存引用循环: 相互引用、 闭包对象相互引用使用弱引用 weak 或者无主引用 unowned当总是相互引用,且同时销毁,应当申明为无主引用,而当引用可能会为nil时,使用弱引用
    转载请注明原文地址: https://ju.6miu.com/read-550153.html

    最新回复(0)