你可以在关联类型后面加上具有泛型 where
的子句。例如,建立一个包含迭代器(Iterator
)的容器,就像是标准库中使用的 Sequence
协议那样。你应该这么写:
protocol Container {
associatedtype Item
mutating func append(_ item: Item)
var count: Int { get }
subscript(i: Int) -> Item { get }
associatedtype Iterator: IteratorProtocol where Iterator.Element == Item
func makeIterator() -> Iterator
}
迭代器(Iterator
)的泛型 where
子句要求:无论迭代器是什么类型,迭代器中的元素类型,必须和容器项目的类型保持一致。makeIterator()
则提供了容器的迭代器的访问接口。
一个协议继承了另一个协议,你通过在协议声明的时候,包含泛型 where
子句,来添加了一个约束到被继承协议的关联类型。例如,下面的代码声明了一个 ComparableContainer
协议,它要求所有的 Item
必须是 Comparable
的。
protocol ComparableContainer: Container where Item: Comparable { }