第十章:协议 Protocol Protocol-Oriented Programming
10.2 协议的两种类型 TwoTypesofProtocols
这一节主要介绍了协议的两种类型带有关联类型的协议
和普通的协议
,还引入了一个新的概念类型抹消
什么是带有关联类型的协议:
class 的范型类型参数写法
class Person<T> { ... }
protocol
和 class、struct 以及 enum 不同,它不支持范型类型参数
。取而代之的是支持抽象类型成员;称作关联类型
。
这样单纯的讲的确有些抽象,其实你在playGround中把下面的demo写一遍就知道很简单的😄
关联类型
就是可以使你在协议方法中的参数类型保存一致。
带有关联类型的协议的使用场景
有时候会遇到这样的需求,继承自某一协议的类中需要保证代理方法处理的参数类型保持一致
我们可以联想UITableView的代理来记忆关联类型的使用场景
协议声明:
protocol ATypeDelegate {
/// 关联类型的协议需要你去手动写associatedtype 创建系统提供的关联类型 T
associatedtype T
/// 自定义函数的参数是
func printContent( ct : T)
func colum( ct : T)
}
协议使用:
class ATypeClass: ATypeDelegate {
///只要遵守了ATypeDelegate协议 系统会自动补全 typealias T = "你指定的类型"
typealias T = Int
func printContent(ct: Int) {
print("Int",#function)
}
func colum(ct: Int) {
print("Int",#function)
}
}
ATypeClass 继承自ATypeDelegate,必须在ATypeClass类中定义 T 的具体类型才能使用
let a = ATypeClass()
a.printContent(ct: 888)
a.colum(ct: 999)
//Int printContent(ct:)
//Int colum(ct:)
类型抹消:
定义和使用场景
所谓类型抹消就是不将某实例的真实类型暴露出去
,对外只暴露一个必要的类型
。
举例
当我们编写一个class或者struct并实现了一个协议,当我们对外提供该实例时,只想让外界知道这个东西实现了该协议,可是又不想让外界知道实现了这个协议的class或者struct是哪一个类型的
,这时我们就需要用到类型抹消
使用方法:
这里推荐swiftgg翻译组的Swift 类型擦除 一文,这里对类型抹消的理解和使用有一个很全面的介绍。
小知识点:
在上一节中我们可以写出
var context: Drawing = SVG()
这里将 Drawing协议 作为一个类型来使用。
当你的协议存在关联类型的协议就不能够像Drawing
这样去使用,编译器会报错
。
网友评论