E文:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Generics.html
associatedtype用於protocol中 associatedtype類型是在protocol中代指一個確定類型並要求該類型實現指定方法
比如 我們定義一個protocol
protocol Container {
associatedtype ItemType
mutating func append(_ item: ItemType)
var count: Int { get }
subscript(i: Int) -> ItemType { get }
}
之后實現這個協議
struct IntStack: Container {
// original IntStack implementation
var items = [Int]()
mutating func push(_ item: Int) {
items.append(item)
}
mutating func pop() -> Int {
return items.removeLast()
}
// conformance to the Container protocol
typealias ItemType = Int
mutating func append(_ item: Int) {
self.push(item)
}
var count: Int {
return items.count
}
subscript(i: Int) -> Int {
return items[i]
}
}
其中items實現了ItemType這個代指變量
由於swift的類型推斷,你實際上並不需要聲明一個具體ItemType的Int作為定義的一部分IntStack。由於IntStack符合所有的要求Container協議,swift可以推斷出適當的ItemType使用,只需通過查看類型append(_:)方法的item參數和標的返回類型。事實上,如果你刪除typealias ItemType = Int上面從代碼行,一切仍然有效,因為很明顯應該使用什么類型ItemType。
