在Swift协议中为typealiases添加约束

时间:2015-09-07 23:15:59

标签: swift swift2

如何指出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。

1 个答案:

答案 0 :(得分:1)

怎么样:

protocol SomeProtocol {
    typealias A = B.Generator.Element
    typealias B: CollectionType
    func f(a: A) -> B
}

修改

您获得的错误是因为AB.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