假设我有一个数组,我想随机选择一个元素。

最简单的方法是什么?

最明显的方法是array[random index]。但也许有一些类似ruby的array。sample?如果没有,可以通过使用扩展来创建这样的方法吗?


当前回答

Swift 3 -简单易用。

创建数组 var arrayOfColors = [UIColor. var红色,用户界面颜色。黄色,用户界面颜色。橙色,UIColor.green] 创建随机颜色 let randomColor = arc4random() % UInt32(arrayOfColors.count) 将该颜色设置为对象 你的项目= arrayOfColors[Int(randomColor)]

下面是SpriteKit项目用随机字符串更新SKLabelNode的一个例子:

    let array = ["one","two","three","four","five"]

    let randomNumber = arc4random() % UInt32(array.count)

    let labelNode = SKLabelNode(text: array[Int(randomNumber)])

其他回答

Swift的另一个建议

private extension Array {
    var randomElement: Element {
        let index = Int(arc4random_uniform(UInt32(count)))
        return self[index]
    }
}

跟随其他人的回答,但有Swift 2支持。

快1.倍

extension Array {
    func sample() -> T {
        let index = Int(arc4random_uniform(UInt32(self.count)))
        return self[index]
    }
}

快2.倍

extension Array {
    func sample() -> Element {
        let index = Int(arc4random_uniform(UInt32(self.count)))
        return self[index]
    }
}

例如:

let arr = [2, 3, 5, 7, 9, 11, 13, 17, 19, 23, 29, 31]
let randomSample = arr.sample()

检查空数组的替代功能实现。

func randomArrayItem<T>(array: [T]) -> T? {
  if array.isEmpty { return nil }
  let randomIndex = Int(arc4random_uniform(UInt32(array.count)))
  return array[randomIndex]
}

randomArrayItem([1,2,3])

这是一个扩展数组与空数组检查更安全:

extension Array {
    func sample() -> Element? {
        if self.isEmpty { return nil }
        let randomInt = Int(arc4random_uniform(UInt32(self.count)))
        return self[randomInt]
    }
}

你可以这样简单地使用它:

let digits = Array(0...9)
digits.sample() // => 6

如果你喜欢一个框架,也有一些更方便的功能,然后签出handysswift。你可以通过Carthage将它添加到你的项目中,然后像上面的例子一样使用它:

import HandySwift    

let digits = Array(0...9)
digits.sample() // => 8

此外,它还包括一个选项,一次获得多个随机元素:

digits.sample(size: 3) // => [8, 0, 7]

斯威夫特3

进口GameKit

func getRandomMessage() -> String {

    let messages = ["one", "two", "three"]

    let randomNumber = GKRandomSource.sharedRandom().nextInt(upperBound: messages.count)

    return messages[randomNumber].description

}