Reputation: 1
I want to create an extension of a Swift Array that returns random N number of elements.
extension Array {
func getRandomItems(max:Int) -> [T] {
var randomItems = [T]()
repeat
{
let randomNumber = Int(arc4random_uniform(UInt32(self.count)))
if contains(randomItems, self[randomNumber]) {
randomItems.append(self[randomNumber])
}
} while (randomItems.count < max)
return randomItems
}
}
print(["Canada","Brazil","China","Japan","U.S"].getRandomNumbers(3))
Compiler says "Cannot invoke 'contains' with an argument list of type '([T], T)' How to make this function work?
Upvotes: 0
Views: 611
Reputation: 10091
You need to make sure you're only extending Arrays that conform to Equatable
. Also, in the newest beta, T
has been replaced with Element
:
extension Array where Element : Equatable {
func getRandomItems(max:Int) -> [Element] {
var randomItems = [Element]()
repeat
{
let randomNumber = Int(arc4random_uniform(UInt32(self.count)))
if randomItems.contains(self[randomNumber]) {
randomItems.append(self[randomNumber])
}
} while (randomItems.count < max)
return randomItems
}
}
Your line if randomItems.contains(self[randomNumber])
should be if !randomItems.contains(self[randomNumber])
.
Upvotes: 1