Steve Cho
Steve Cho

Reputation: 1

Check existence of Swift Array item with Generic

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

Answers (1)

oisdk
oisdk

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

Related Questions