【问题标题】:How can I avoid repeating these type constraints?如何避免重复这些类型约束?
【发布时间】:2017-05-11 02:41:57
【问题描述】:

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

【问题讨论】:

标签: swift


【解决方案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 并将其放在与使用类相同的文件中来模仿访问控制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2019-07-30
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    相关资源
    最近更新 更多