如何在swift协议中指定多个相互依赖的关联类型?

时间:2015-04-07 09:01:33

标签: swift generics types protocols where

如何在协议中指定多个关联类型,并在内部关联类型上添加依赖关系?例如:

protocol CombinedType
{
    typealias First: FirstType
    typealias Second: SecondType

    var first: First { get }
    var second: Second { get }
}

protocol FirstType
{
    typealias Value
    var value: Value { get }
}

protocol SecondType
{
    type alias Value
    var value: Value { get }
}

我需要在 CombinedType 协议上指定一个限制,使其更像 FirstType.Value == SecondType.Value ,就像在子句。

没有这个限制,代码:

func sum<Combined: CombinedType>(combined: Combined) -> Combined.FirstType.Value
{
    return combined.first + combined.second
}

产生错误 Combined.FirstType.Value Combined.SecondType.Value 不兼容。< / p>

但是如果我明确地将 where 子句添加到函数中,它就会编译:

func sum<Combined: CombinedType where Combined.FirstType.Value == Combined.SecondType.Value>(combined: Combined) -> Combined.FirstType.Value
{
    return combined.first + combined.second
}

问题是这个哪里需要在任何地方复制,这会产生大量的样板,并且在另一个协议中使用 CombinedType 时会更糟糕,在这种情况下 where 子句变得越来越大。

我的问题是:我能以某种方式在协议本身中包含这种限制吗?

0 个答案:

没有答案