As of Swift 1.2, Apple introduces Set
collection type.
Say, I have a set like:
var set = Set(arrayLiteral: 1, 2, 3, 4, 5)
Probably the best approach is advance
which walks successor
for you:
func randomElementIndex(s: Set) -> T {
let n = Int(arc4random_uniform(UInt32(s.count)))
let i = advance(s.startIndex, n)
return s[i]
}
(EDIT: Heh; noticed you actually updated the question to include this answer before I added it to my answer... well, still a good idea and I learned something too. :D)
You can also walk the set rather than the indices (this was my first thought, but then I remembered advance
).
func randomElement(s: Set) -> T {
let n = Int(arc4random_uniform(UInt32(s.count)))
for (i, e) in enumerate(s) {
if i == n { return e }
}
fatalError("The above loop must succeed")
}