为Int,Double,CGFloat创建通用扩展

时间:2017-05-02 07:10:18

标签: swift swift-extensions

我有一个扩展名,它可以帮助我使用min和max来限制一个值。在不同的场景中,我需要使用不同的类型,如Int,Float,Double,CGFloat。为此,我创建了多个扩展,如下所示。

extension Int {
    func clamp(min: Int, _ max: Int) -> Int {
        return Swift.max(min, Swift.min(max, self))
    }
}

extension CGFloat {
    func clamp (min: CGFloat, _ max: CGFloat) -> CGFloat {
        return Swift.max(min, Swift.min(max, self))
    }
}

那么,如何通过使用仅确认采用数值的泛型类型T来使其更通用?

1 个答案:

答案 0 :(得分:2)

这是我使用的扩展程序。它使用嵌套条件而不是最大/最小方法。这允许它可能使其中一个分支短路,这可以提高性能(如果重要的话)。

extension Comparable {
    func clamped(to r: ClosedRange<Self>) -> Self {
        let min = r.lowerBound, max = r.upperBound
        return self < min ? min : (max < self ? max : self)
    }
}

10.clamped(to: 0...5) // => 5