使用协议关联类型声明AssociatedType,使用Self关键字申明Self.AssociatedType。
AssociatedType是协议中声明一个或多个占位符类型的关键字。它允许协议中的方法、属性等使用具体的类型。而使用Self关键字可以在协议及其实现中引用当前类型,包括其属性、方法、关联类型等。
举个例子,假设有一个协议:
protocol MyProtocol { associatedtype MyType
func myFunction(myParameter: MyType) }
那么实现此协议的类或结构体要求定义一个MyType的具体类型:
class MyClass: MyProtocol { typealias MyType = Int
func myFunction(myParameter: MyType) { // ... } }
而当需要在协议中引用当前类型时,可以使用Self关键字:
protocol MyProtocol { associatedtype MyType
var myProperty: Self.MyType { get set } }
在实现中,需要将该关联类型实现为当前类型的具体类型:
class MyClass: MyProtocol { typealias MyType = Int
var myProperty: Int = 0 // 实现为Int类型 }
可以看到,在使用AssociatedType与使用Self.AssociatedType时的主要区别在于,一个是为协议中的占位符类型命名,另一个是在协议及其实现中引用当前类型的关键字。