Skip to content

Instantly share code, notes, and snippets.

@leemorgan
Last active November 9, 2022 15:36
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save leemorgan/bf1a0a1a8b2c94bce310 to your computer and use it in GitHub Desktop.
Save leemorgan/bf1a0a1a8b2c94bce310 to your computer and use it in GitHub Desktop.
clamp() in Swift
///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
}
}
@zaggo
Copy link

zaggo commented Jan 21, 2016

Thanks. The only thing I added to this is a assert(lower <= upper) before the return statement in order to catch accidental mixups with the lower/upper arguments...

@davidlawson
Copy link

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)

@fulldecent
Copy link

There is also discussion here http://stackoverflow.com/a/43769799/300224 with a more detailed answer.

@lutes1
Copy link

lutes1 commented Nov 9, 2022

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