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

Create generic extension for Int, Double, CGFloat

我有一个扩展程序可以帮助我用最小值和最大值来限制一个值的范围。在不同的场景中,我需要使用不同的类型,如 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 使其更通用?

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

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