如何指出B.Generator.Element
应为A
?
protocol SomeProtocol {
typealias A
typealias B: CollectionType
func f(a: A) -> B
}
我意识到我可以完成func f(node: B.Generator.Element) -> B
并完全取消A
,但如果A
在其他协议和SomeProtocol
中定义,我就无法做到这一点继承自它。
修改
添加了示例
protocol P {
typealias A
}
protocol Q: P {
typealias B: CollectionType
typealias A = B.Generator.Element
func f(node: A) -> B
}
func g<A, T: Q where A == T.A>(arg1: T, arg2: A) {
let collection = arg1.f(arg2)
collection.contains(arg2) // Error here
}
编辑2:
为了澄清,我希望以某种方式在协议本身中指定A == B.Generator.Element
因为我必须使用自由函数。我在开发人员论坛中发现thread正好是我的问题。看起来它是当前类型系统的一个限制。我已经提出了雷达,让我们希望它得到解决:)
编辑3: 该问题已经存在雷达。提交时使用rdar:// 21420236。
答案 0 :(得分:1)
怎么样:
protocol SomeProtocol {
typealias A = B.Generator.Element
typealias B: CollectionType
func f(a: A) -> B
}
修改强>
您获得的错误是因为A
(B.Generator.Element
}无法保证符合Equatable
。因此,contains
定义为:collection
,您无法在contains
上致电extension SequenceType where Generator.Element : Equatable {
public func contains(element: Self.Generator.Element) -> Bool
}
:
contains
(我不确定为什么Xcode会将// Since you're using Swift 2 you could use a protocol extension instead of a free function.
// Unfortunately, Xcode complains without the explicit declaration that `A` is
// `B.Generator.Element`.
extension Q where A: Equatable, A == B.Generator.Element {
func g(elem: A) {
let collection = f(elem)
collection.contains(elem)
...
}
}
作为一种有效的方法来调用,可能是一个错误......)
要解决此问题,您可以:
j+1