错误:类型可能不会将自身引用为需求associatedtype后缀:SuffixableContainer,其中Suffix.Item == Item

时间:2018-03-26 11:35:37

标签: ios swift generics protocols

当我在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类型相同。

1 个答案:

答案 0 :(得分:1)

protocol SuffixableContainer: Container {
    associatedtype Suffix: SuffixableContainer
    // ...
}

在关联类型上使用“递归约束”:关联的 类型Suffix受限于封闭协议SuffixableContainer

相关类型的递归约束是在Swift 4.1中实现的,即该代码需要Xcode 9.3(目前处于测试阶段)。

来自Swift CHANGELOG

  

Swift 4.1

     

...

     

SE-0157已实施。关联类型现在可以声明“递归”约束,这要求关联类型符合封闭协议。