如何避免重复这些类型约束?

时间:2017-05-10 17:39:20

标签: swift

A有很多具有以下签名的功能:

func defilter_up<ReferenceLine:Collection>(line:ReferenceLine) where ReferenceLine.Iterator.Element == UInt8, ReferenceLine.Index == Int

func defilter_average<ReferenceLine:Collection>(line:ReferenceLine) where ReferenceLine.Iterator.Element == UInt8, ReferenceLine.Index == Int

func defilter_sub<ReferenceLine:Collection>(line:ReferenceLine) where ReferenceLine.Iterator.Element == UInt8, ReferenceLine.Index == Int

这些类型限制变得非常漫长且难以处理。有没有一种好的方法可以避免重复输入它们,相当于泛型的typealias

1 个答案:

答案 0 :(得分:1)

您可以使包含类/结构通用:

struct MyClass<ReferenceLine:Collection where 
    ReferenceLine.Iterator.Element == UInt8, 
    ReferenceLine.Index == Int> {

    func defilterUp(line: ReferenceLine) { ... }
    func defilterAverage(line: ReferenceLine) { ... }
    func defilterSub(line: ReferenceLine) { ... }
}

另一个选择是重构代码,使它们是 泛化对象的函数,如下所示。这是代码结构的重大变化,因此如果没有上下文,我无法确定这是否适用于您的用例。

extension Collection where Iterator.Element == UInt8, Index == Int {
    func defilterUp() { ... }
    func defilterAverage() { ... }
    func defilterSub() { ... }
}

如果这些函数对于单个类是私有的,则可以通过将其设置为private extension来模仿访问控制,并将其放在与使用类相同的文件中。