当我在playground xcode 9.2 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Generics.html
上运行时,错误来自Apple文档代码部分:使用类型注释来约束关联类型
protocol Container {
associatedtype Item: Equatable
mutating func append(_ item: Item)
var count: Int { get }
subscript(i: Int) -> Item { get }
}
protocol SuffixableContainer: Container {
associatedtype Suffix: SuffixableContainer where Suffix.Item == Item
func suffix(_ size: Int) -> Suffix
}
他们的解释:在这个协议中,后缀是一个关联类型,就像上面容器示例中的Item类型一样。后缀有两个约束:它必须符合SuffixableContainer协议(当前正在定义的协议),其Item类型必须与容器的Item类型相同。
答案 0 :(得分:1)
protocol SuffixableContainer: Container {
associatedtype Suffix: SuffixableContainer
// ...
}
在关联类型上使用“递归约束”:关联的
类型Suffix
受限于封闭协议SuffixableContainer
。
相关类型的递归约束是在Swift 4.1中实现的,即该代码需要Xcode 9.3(目前处于测试阶段)。
Swift 4.1
...
SE-0157已实施。关联类型现在可以声明“递归”约束,这要求关联类型符合封闭协议。