So I'm trying to extend Swift's integer types with a few convenient functions that I use a lot, however I'm not clear on which protocols I should be extending.
As an example, let's say I want to implement a function for clamping a value (if it's less than a minimum set it to that, otherwise if it's greater than a maximum then set it to that instead). My first thought was to do something like this:
extension Int {
func clamp(minimum:Int, maximum:Int) {
if self < minimum { return minimum }
if self > maximum { return maximum }
return self
}
}
Bit of a simplistic example, but it illustrates the problem; if I want to now call this for a UInt
then naturally I can't, so I have to add an equivalent to UInt
, but that won't work for a UInt16
and so-on.
I thought that I could perhaps extend something higher up the chain, and use generics instead, however protocols such as IntegerType
can't seem to be extended.
So, is there somewhere more appropriate that I could put my extension(s)?
While Swift 2.0 is still in beta I suggest you to add extensions like you illustrated. You will have to copy-paste the same code for Int
, Int64
etc, but there is no other way to do what you want at the moment.
Once Swift 2.0 is out you will be able to do this
extension IntegerType {
mutating func clamp(minimum:Self, maximum:Self) {
if self < minimum { self = minimum }
if self > maximum { self = maximum }
}
}
If you can wait with the release of your app until some time in September then I encourage you to start using Swift 2.0 right now.
With Swift 2.0 you can also add extension to Comparable
protocol which will ensure that clamp()
is available for other types such as Double
, Float
, etc
extension Comparable {
mutating func clamp(minimum:Self, maximum:Self) {
if self < minimum { self = minimum }
if self > maximum { self = maximum }
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With