Range

Code

`...` vs `..<`

Closed

let closedRange = 1...100
let openRange = 

Clamping

precondition

Limit Range via a precondition - run time failure

let param = 24
precondition((0...20).contains(param))
// Precondition failed

apple docs | precondition

logic


a -> 4.2
b -> 0
c -> 5

// Keeps a range of `0...5`
let clamped = min(max(a, 0), 5)

Extension

Extension of Comparable/Strideable similar to ClosedRange.clamped(to:_) -> ClosedRange from standard Swift library.

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

#if swift(<5.1)
extension Strideable where Stride: SignedInteger {
    func clamped(to limits: CountableClosedRange<Self>) -> Self {
        return min(max(self, limits.lowerBound), limits.upperBound)
    }
}
#endif

Usage:

15.clamped(to: 0...10) // returns 10
3.0.clamped(to: 0.0...10.0) // returns 3.0
"a".clamped(to: "g"..."y") // returns "g"

// this also works (thanks to Strideable extension)
let range: CountableClosedRange<Int> = 0...10
15.clamped(to: range) // returns 10

Clamping example in swift | SO

Kotlin coerce range like function
playground to play with it