小编典典

从Swift数组中随机选择一项,无需重复

swift

该代码从一组预设颜色中选择一种随机颜色。如何使同一颜色不会被多次拾取?

var colorArray = [(UIColor.redColor(), "red"), (UIColor.greenColor(), "green"), (UIColor.blueColor(), "blue"), (UIColor.yellowColor(), "yellow"), (UIColor.orangeColor(), "orange"), (UIColor.lightGrayColor(), "grey")]

var random = { () -> Int in
    return Int(arc4random_uniform(UInt32(colorArray.count)))
} // makes random number, you can make it more reusable


var (sourceColor, sourceName) = (colorArray[random()])

阅读 381

收藏
2020-07-07

共1个答案

小编典典

创建一个索引数组。从数组中删除索引之一,然后使用它来获取颜色。

像这样:

var colorArray = [
  (UIColor.redColor(), "red"), 
  (UIColor.greenColor(), "green"), 
  (UIColor.blueColor(), "blue"), 
  (UIColor.yellowColor(), "yellow"), 
  (UIColor.orangeColor(), "orange"), 
  (UIColor.lightGrayColor(), "grey")]

var indexes = [Int]();

func randomItem() -> UIColor
{
  if indexes.count == 0
  {
    print("Filling indexes array")
    indexes = Array(0..< colorArray.count)
  }
  let randomIndex = Int(arc4random_uniform(UInt32(indexes.count)))
  let anIndex = indexes.removeAtIndex(randomIndex)
  return colorArray[anIndex].0;
}

上面的代码创建一个数组indexes。该函数randomItem看是否indexes为空。如果是,则使用0到的索引值填充它colorArray.count - 1

然后,它在indexes数组中选择一个随机索引,从数组中的该索引处删除值indexes,然后使用它从中获取并返回一个对象colorArray。(它不会从中删除对象colorArray。它使用间接操作,并从indexsArray中删除对象,该对象最初包含。中每个条目的索引值colorArray

上面的一个缺陷是,从indexArray中获取最后一个项目后,将使用一整套索引对其进行填充,并且从新填充的数组中获得的下一个颜色可能与您最后一个颜色相同得到。

可以添加额外的逻辑来防止这种情况。

2020-07-07