Swift:如何始终从混洗后的数组中获得不同的价值

时间:2019-03-02 16:10:01

标签: ios arrays swift shuffle

我基本上在按钮内创建了一个单词数组,每次按下按钮时,都会从该数组中获得一个随机项。现在有时候我得到相同的物品。如果我不希望自己的商品重复出现并且总是想获得新商品怎么办? (很明显,我什至希望他们在本全部显示一次之后重复他们的循环)。

@IBOutlet weak var shoppingLabel : UILabel!
@IBAction func shoppingListButton(_ sender: Any) {
         var shoppingList = ["Oranges","Apples","Broccoli"].shuffled()
        print(shoppingList)
        resultLabel.text = shoppingList.first ?? ""
    }

这不是重复的,因为类似的问题在按钮外有一个数组,并且是一个var数组,我的是让。对于我的数组,我无法从中删除项目,因为它无法更改,不,我无法将其设为var数组...

1 个答案:

答案 0 :(得分:1)

要遍历随机数组:

  1. 创建数组
  2. 随机洗一次
  3. 通过从头到尾循环遍历数组来选择值

要实现1)和2),只需将数组定义为常量,然后将其改组为您要使用的方法之外。

要实现3)创建一个附加变量,以跟踪您当前所在的数组的索引,并在选择一个值后对其进行递增。

为确保不超出数组的范围并实现数组的“循环”,请在索引大于数组的最后一个索引时将索引重置为0。一种简单的方法是在Swift中使用余数运算符%。

例如

let shoppingList = ["Oranges", "Apples", "Broccoli"].shuffled()
var currentIndex = 0

@IBAction func shoppingListButton(_ sender: Any) {

    // pick an item
    let nextItem = shoppingList[currentIndex]

    // update the label
    resultLabel.text = nextItem

    // increment the index to cycle through items
    currentIndex = (currentIndex + 1) % shoppingList.count
}

要从数组中选择随机的非重复值:

  1. 创建数组
  2. 从数组中选择一个随机值
  3. 如果选择的值等于最后一个值,请选择一个新值

要实现2),请使用randomElement()函数选择一个随机元素。这比在整个数组中进行混洗并每次都选择第一个元素要便宜。

要实现3),请使用while循环或类似方法继续选择随机元素,直到生成新元素为止。

例如

let shoppingList = ["Oranges", "Apples", "Broccoli"]

@IBAction func shoppingListButton(_ sender: Any) {

    // pick a random element that is not equal to the last one
    var nextItem: String?
    repeat {
        nextItem = shoppingList.randomElement()
    } while nextItem == resultLabel.text

    // update the label
    resultLabel.text = nextItem
}