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

原创 2017年01月12日 23:58:58

多态概念

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

向下转换

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

  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时,使用弱引用
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mangosnow/article/details/54388777

Swift基础框架的封装

最近闲来无事,就自学了swift编程语言,并且根据之前OC的经验,封装了Swift版本的基础框架,一些常用的的方法,常用的类库和第三方,都封装到了一起,方便以后新项目的使用,在这里,分享给大家,欢迎大...
  • z1332291552
  • z1332291552
  • 2017-04-28 11:06:05
  • 529

swift面向对象之多态与继承

swift面向对象之多态与继承 1.多态 运行时多态 运行时多态的要点 1.要有继承关系的存在 2.子类要重写父类的方法 3.父类类型的引用指向子类实例 2.继承 1.继承的注...
  • qq_25491201
  • qq_25491201
  • 2016-04-27 09:15:50
  • 1825

[Swift]多态类型转换以及不确定类型

1. Swift的多态:     1) 和其它语言多态描述一致,都是用父类指针或引用(这里的父类是指祖先类)指向子类的实例,然后在子类中覆盖父类的方法,利用该父类引用调用相同的方法而产生不同的行为; ...
  • Lirx_Tech
  • Lirx_Tech
  • 2014-12-02 16:17:11
  • 1605

泛型+多态

泛型的基础是多态
  • u010073895
  • u010073895
  • 2015-07-28 22:55:47
  • 799

<em>swift4</em>进阶打包各种格式

2018-04-01 上传大小:8.68<em>MB</em> <em>swift4</em>进阶 最新版<em>swift4</em>进阶文档打包下载,包含格式PDF,EPUB,MOBI,三种格式任你选 综合评分:0(0位用户评分) 收藏评论举报 所需:...
  • 2018年04月01日 00:00

Swift 4官方文档中文版/ Basic Operators(下)

翻译Apple官方文档: The Swift 4 Programming Language...
  • feng2qing
  • feng2qing
  • 2017-06-30 16:17:57
  • 2882

【iOS】Swift中扩展extension与协议protocol

一起连带前面几篇Playground小结代码都转到github上了。Swift语法主要部分差不多就这些了。当然还有泛型、运算符重载、ARC、闭包之类的补充。 一、扩展(extension) 扩展 e...
  • xn4545945
  • xn4545945
  • 2014-10-05 06:11:06
  • 24593

《从零开始学Swift》学习笔记(Day 51)——扩展构造函数

创文章,欢迎转载。转载请注明:关东升的博客  扩展类型的时候,也可以添加新的构造函数。值类型与引用类型扩展有所区别。值类型包括了除类以外的其他类型,主要是枚举类型和结构体类型。 值类型扩展构造函数扩展...
  • tonny_guan
  • tonny_guan
  • 2015-12-23 10:08:06
  • 1754

4、封装

1、定义类成员时,public表示所定义的成员可以使用声明的对象名称加上.运算符来直接调用;    而private用来定义一个私有成员,私有成员只能在类中使用,不可以通过参考名称加上.运算符来直接调...
  • zwb8848happy
  • zwb8848happy
  • 2014-01-31 10:37:13
  • 431

Swift基础之封装一个WebViewController

研究了一段时间,总算搞定了这个功能封装,现在给大家分享一下,具体看代码,上面有对应的文字描述,有问题请留言,下载源码,请帮忙点一下star,给点继续分享的动力,谢谢~/** //swift中...
  • hbblzjy
  • hbblzjy
  • 2017-08-09 17:36:46
  • 678
收藏助手
不良信息举报
您举报文章:Swift 学习笔记 [4] 类 多态和封装、协议、扩展、内存管理
举报原因:
原因补充:

(最多只允许输入30个字)