这一节主要介绍了协议的两种类型普通的协议
和带有关联类型的协议
, 咱们再前面讲的都是普通的协议,本小节还引入了一个新的概念类型抹消
git
class 的范型类型参数写法github
class Person<T> { ... }
复制代码
protocol
和 class、struct 以及 enum 不一样,它不支持范型类型参数
。取而代之的是支持抽象类型成员;称做关联类型
。swift
这样单纯的讲的确有些抽象,其实你在playGround中把下面的demo写一遍就知道很简单的😄函数
关联类型
就是能够使你在协议方法中的参数类型保存一致。spa
有时候会遇到这样的需求,继承自某一协议的类中须要保证代理方法处理的参数类型保持一致
咱们能够联想UITableView的代理来记忆关联类型的使用场景翻译
协议声明:代理
protocol ATypeDelegate {
/// 关联类型的协议须要你去手动写associatedtype 建立系统提供的关联类型 T
associatedtype T
/// 自定义函数的参数是
func printContent( ct : T)
func colum( ct : T)
}
复制代码
协议使用:code
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:)
复制代码
所谓类型抹消就是不将某实例的真实类型暴露出去
,对外只暴露一个必要的类型
。ci
举例 当咱们编写一个class或者struct并实现了一个协议,当咱们对外提供该实例时,只想让外界知道这个东西实现了该协议,但是又不想让外界知道实现了这个协议的class或者struct是哪个类型的
,这时咱们就须要用到类型抹消
使用方法: 这里推荐swiftgg翻译组的Swift 类型擦除 一文,这里对类型抹消的理解和使用有一个很全面的介绍。
在上一节中咱们能够写出
var context: Drawing = SVG()
复制代码
这里将 Drawing协议 做为一个类型来使用。
当你的协议存在关联类型的协议就不可以像Drawing
这样去使用,编译器会报错
。