Last active
November 9, 2022 15:36
-
-
Save leemorgan/bf1a0a1a8b2c94bce310 to your computer and use it in GitHub Desktop.
clamp() in Swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
///Returns the input value clamped to the lower and upper limits. | |
func clamp<T: Comparable>(value: T, lower: T, upper: T) -> T { | |
return min(max(value, lower), upper) | |
} | |
//----------------------------------------------- | |
// Example usage | |
let proposedIndex = 6 | |
let i = clamp(proposedIndex, 0, 5) | |
// What clamp() replaces | |
func getIndex(proposedIndex: Int) -> Int { | |
if proposedIndex < 0 { | |
return 0 | |
} | |
else if proposedIndex <= 5 { | |
return proposedIndex | |
} | |
else { | |
return 5 | |
} | |
} |
Alternative:
extension Comparable
{
func clamp<T: Comparable>(lower: T, _ upper: T) -> T {
return min(max(self as! T, lower), upper)
}
}
Example usage:
let value = 7
let clamped = value.clamp(3, 6)
There is also discussion here http://stackoverflow.com/a/43769799/300224 with a more detailed answer.
To avoid force casting you could do something like that since Self is Comparable
extension Comparable {
func clamp(lower: Self, upper: Self) -> Self {
return min(max(self, lower), upper)
}
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks. The only thing I added to this is a
assert(lower <= upper)
before thereturn
statement in order to catch accidental mixups with the lower/upper arguments...