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
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