I have one extension which helps me to range bound a value with min and max. There are different scenarios where I need to use a different type like Int, Float, Double, CGFloat. So for that, I have created multiple extensions like below.
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))
}
}
So, how can I make it more generic by using generic type T which only confirms to take numeric values?
Here's the extension I use. It uses nested conditionals instead of the max/min approach. This allows it to potentially short circuit one of the branches, which can improve performance (if it matters).
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