Hi there!
Ole Begeman offers here <https://oleb.net/blog/2016/09/swift-3-ranges/> (take a
look at the bottom of the page) an interesting consideration about converting
between half-open and closed ranges.
As of now, it seems the way to go is by overloading…
import Foundation
func random(from range: Range<Int>) -> Int {
let lowerBound = range.lowerBound
let upperBound = range.upperBound
return lowerBound + Int(arc4random_uniform(UInt32(upperBound - lowerBound)))
}
func random(from range: ClosedRange<Int>) -> Int {
let lowerBound = range.lowerBound
let upperBound = range.upperBound
return lowerBound + Int(arc4random_uniform(UInt32(upperBound - lowerBound +
1)))
}
let r1 = random(from: 4 ..< 8)
let r2 = random(from: 6 ... 8)
Cheers,
— A
> On Oct 12, 2016, at 6:21 AM, Jean-Denis Muys via swift-users
> <[email protected]> wrote:
>
> Hi,
>
> I defined this:
>
> func random(from r: Range<Int>) -> Int {
> let from = r.lowerBound
> let to = r.upperBound
>
> let rnd = arc4random_uniform(UInt32(to-from))
> return from + Int(rnd)
> }
>
> so that I can do:
>
> let testRandomValue = random(from: 4..<8)
>
> But this will not let me do:
>
> let otherTestRandomValue = random(from: 4...10)
>
> The error message is a bit cryptic:
>
> “No ‘…’ candidate produce the expected contextual result type ‘Range<Int>’”
>
> What is happening is that 4…10 is not a Range, but a ClosedRange.
>
> Of course I can overload my function above to add a version that takes a
> ClosedRange.
>
> But this is not very DRY.
>
> What would be a more idiomatic way?
>
> Thanks,
>
> Jean-Denis
>
> _______________________________________________
> swift-users mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users