5

I'm trying to access an array using random indexes by using arc4random to generate the random index. I'm sorry if my "technical usage of terms" are incorrect as I am fairly new to the development scene.

var backLeft = ["Clear","Drop","Smash"];    
var i = (arc4random()%(3))
var shot = backLeft[i]

This gives me an error on the third line,

Could not find an overload for 'subscript' that accepts the supplied arguments.

But, if I use,

var i = 2
var shot = backLeft[i]

Then it doesn't give me any issues. Coming from a php background, I can't seem to have any clue what's going wrong here.

Thank You! :) PS: I'm trying this on XCODE 6 inside the Swift Playground

Cezar
  • 55,636
  • 19
  • 86
  • 87
  • Possible duplicate of [Pick a random element from an array](http://stackoverflow.com/questions/24003191/pick-a-random-element-from-an-array) – Jeehut Jun 09 '16 at 18:06
  • @Dschee, I think this question was posted before array.randomElement() was a thing? – user3083988 Jun 19 '18 at 00:27

2 Answers2

10

That's due to Swift's enforcement of type safety.

arc4random() returns a UInt32, and the subscript operator takes an Int.

You need to make sure i is of type Int before passing it into the subscript operator.

You can do so by initializing an Int from i:

var shot = backLeft[Int(i)]

Or, you can do the same to the random value before assigning it to i and then access i normally:

var i = Int(arc4random()%(3))
var shot = backLeft[i]
Cezar
  • 55,636
  • 19
  • 86
  • 87
  • You can also cast the array length to Uint32 rather than hard coding it: arc4random() % UInt32(backLeft.count) – Nick Jun 04 '14 at 20:59
1

With Swift 5, if you want to get a random element from an array, you can use Array's randomElement() method:

let array = ["Clear","Drop","Smash"]
let randomElement = array.randomElement()
print(String(describing: randomElement)) // Optional("Smash")

If you want to get a random index from an array, you can use Array's indices property and Range's randomElement() method:

let array = ["Clear","Drop","Smash"]
let randomIndex = array.indices.randomElement()
print(String(describing: randomIndex)) // Optional(1)
Imanou Petit
  • 89,880
  • 29
  • 256
  • 218