协议关联类型-PAT

简而言之,我们都知道面向协议的编程的功能。 要在蛋糕上添加樱桃,我们在协议中提供了“关联类型”。

让我们创建一个简单的Stack功能:

 协议栈{var count:Int {get}变异func push(item:Int)变异func pop()-> Int}结构容器:Stack {var items = [Int]() 
var count:Int {
返回items.count
}更改func push(item:Int){
items.append(item)
}更改func pop()-> Int {
返回items.removeLast()
}
} var intContainer =容器(项目:[])
intContainer.push(项目:10)
intContainer.push(项目:20)
intContainer.push(项目:30)
intContainer.push(项目:40)
intContainer.push(项目:50)print(intContainer.count)
打印(intContainer.pop())

但是,这对我们当前的Stack协议很有用,但是有一个主要的缺点。 只有处理Int的容器才能符合此协议。

我们可以使用“关联类型”功能来消除此限制。 关联类型像泛型一样工作。 为了演示,让我们更改Stack协议以利用关联的类型:

 协议栈{ 
关联类型ItemType
var count:Int {get}
变异func push(项目:ItemType)
变异func pop()-> ItemType
}

现在,堆栈协议允许存储任何类型的项目(整数,字符串或任何其他自定义类型)

  struct Container :堆栈{ 
var个项= [T]()
var count:Int {
返回items.count
}使func push(item:T){
items.append(item)
}更改func pop()-> T {
返回items.removeLast()
}
}

Container结构的实现中,编译器根据上下文确定关联的类型(即方法返回类型和参数类型)。 这种方法使我们能够创建具有通用项类型的Container结构。

  var intContainer = Container (项目:[]) 
intContainer.push(项目:10)
intContainer.push(项目:20)
intContainer.push(项目:30)
intContainer.push(项目:40)
intContainer.push(项目:50)打印(dummyContainer.count)
打印(dummyContainer.pop())

上面的容器显示了整数堆栈示例。 同样,我们可以使用String或任何其他自定义类型。

  var stringContainer = Container (items:[]) 
stringContainer.push(项目:“ 10”)
stringContainer.push(项目:“ 20”)
stringContainer.push(项目:“ 30”)
stringContainer.push(项目:“ 40”)
stringContainer.push(item:“ 50”)print(stringContainer.count)
打印(stringContainer.pop())

在许多情况下,使用协议可以简化代码编写。 具有关联类型的协议只是其中包含泛型的协议的术语。 通过使用PAT(通常是协议),我们可以避免混乱的继承。