我该如何表明
我意识到我可以执行
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
,因为我必须使用一个自由函数。我在开发者论坛中找到了一个线程,正是我的问题。看起来这是当前类型系统的限制。我已经提交了一个radar,希望能解决这个问题 :)
编辑3:
该问题已经有一个radar。在提交时使用rdar://21420236。
A
不能保证始终是B.Generator.Element
。因此,我无法在B
的实例上使用诸如append
之类的函数与A
的实例一起使用。Xcode正确地将其标记为错误... - RoshanA = B.Generator.Element
。 - KametrixomA == B.Generator.Element
,因为我必须使用自由函数。contains
完全是我的错 - 我把它剥得太干净了。我在开发者论坛中找到了一篇帖子,正好遇到了我的问题。看起来这是当前类型系统的限制。我已经提交了一个反馈,希望能解决 :) - Roshan