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时,使用弱引用
版权声明:本文为博主原创文章,未经博主允许不得转载。

Swift开发必备技巧:内存管理、weak和unowned

因为 Playground 本身会持有所有声明在其中的东西,因此本节中的示例代码需要在 Xcode 项目环境中运行。在 Playground 中可能无法得到正确的结果。 不管在什么语言里,内存管...
  • u013406800
  • u013406800
  • 2017年02月18日 09:22
  • 1356

Swift的自动引用计数->解决内存泄露

Swift的自动引用计数->解决内存泄露 在swift中的变量一般分为三种: 1、          strong 强引用  默认 2、          weak  弱引用  定义时前面加 we...
  • qq_14920635
  • qq_14920635
  • 2016年05月24日 12:05
  • 2104

Swift内存模型的那点事儿

讲述测量Swift对象大小和篡改数据
  • brycegao321
  • brycegao321
  • 2017年07月20日 11:55
  • 1879

Swift内存管理-示例讲解

具体而言,Swift中的ARC内存管理是对引用类型的管理,即对类所创建的对象采用ARC管理。而对于值类型,如整型、浮点型、布尔型、字符串、元组、集合、枚举和结构体等,是由处理器自动管理的,程序员不需要...
  • tonny_guan
  • tonny_guan
  • 2014年09月04日 20:13
  • 3355

swift面向对象之多态与继承

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

Swift 系统学习 26 Swift语言中的继承, 多态和重写

//: Playground - noun: a place where people can play import UIKit /* * 本节主要内容: * 1.Swift语言中的继承, ...
  • clarence20170301
  • clarence20170301
  • 2017年03月01日 15:25
  • 117

Swift内存管理(ARC)

原文出自:Swift ARC总结 引言Swift使用自动引用计数(ARC)机制来处理内存。通常情况下,Swift内存管理机制会自动管理内存,无须我们考虑内存的管理。ARC会在类的实例不再被使用(也就是...
  • woaifen3344
  • woaifen3344
  • 2015年10月18日 12:05
  • 1002

Swift自动引用计数 - 解决内存泄露

1、自动引用计数概念  Swift 使用自动引用计数(ARC)这一机制来跟踪和管理你的应用程序的内存。通常情况下,Swift 的内存管理机制会一直起着作用,你无须自己来考虑内存的管理。ARC 会在类...
  • andybegin
  • andybegin
  • 2014年10月09日 22:19
  • 928

swift函数式编程(高级)-闭包,协议,扩展,泛型,可空链

swift函数式编程实际是非常灵活的,在函数的高级应用中,实际上还包括了闭包,协议,泛型等等oc中没有的概念,按照顺序介绍这些概念和应用。 一:闭包 闭包实际就是objective-c中的bloc...
  • Dog_Tang
  • Dog_Tang
  • 2016年01月08日 12:01
  • 613

Swift的协议默认实现

继承和组合的缺点 带默认实现的协议 小结继承和组合的缺点在开发工作中,继承总是用来在多个类之间共享代码。 设想一个场景,一个人类,可以说话和睡觉,而一个Worker,除了上述功能,还可以工作。 解...
  • xsl_bj
  • xsl_bj
  • 2016年05月09日 11:52
  • 3211
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Swift 学习笔记 [4] 类 多态和封装、协议、扩展、内存管理
举报原因:
原因补充:

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