【问题标题】:Not Repeating Word in Swift when clicking button - IOS单击按钮时在 Swift 中不重复单词 - IOS
【发布时间】:2020-03-06 02:26:19
【问题描述】:

当我快速单击按钮时,如何不重复数组?我试图在不重复的情况下产生水果。

import UIKit

class fruitrandomViewController: UIViewController {
@IBOutlet weak var nextfruitButton: UIButton!
@IBOutlet weak var fruitbox: UILabel!

@IBAction func fruitbutton(_ sender: UIButton) {

    let array = ["Apple","Banana","Orange","Pinapple", "Plum", "Pear",]


    let randomFruitgenerator = Int(arc4random_uniform(UInt32(array.count)))
    fruitbox.text = array[randomFruitgenerator]

    }
}

【问题讨论】:

标签: ios arrays swift random


【解决方案1】:

我的建议是使用Set 并从集合中删除随机项

var set = Set(["Apple","Banana","Orange","Pinapple", "Plum", "Pear"])

@IBAction func fruitbutton(_ sender: UIButton) {
    if let fruit = set.randomElement() {
        fruitbox.text = fruit
        set.remove(fruit)
    } else {
        fruitbox.text = "" // or whatever to indicate that the set is empty
    }
}

【讨论】:

    【解决方案2】:

    我的建议:

    你可以随机每个项目1次

    let originFruits = ["Apple","Banana","Orange","Pinapple", "Plum", "Pear"]
    let array = originFruits
    
    @IBAction func fruitbutton(_ sender: UIButton) {
    ...
     let fruitRandom = array random
     array delete fruitRandom 
      if (array empty) {
        array = originFruits
      }
    }
    

    您可以在下次检查并删除

    let originFruits = ["Apple","Banana","Orange","Pinapple", "Plum", "Pear"]
    let array = originFruits
    let skipFruit = ""
    
    @IBAction func fruitbutton(_ sender: UIButton) {
    ...
     array = originFruits
     array delete skipFruit
     let fruitRandom = array random
     skipFruit = fruitRandom
    }
    

    【讨论】:

    • 谢谢!但这仍然在重复一些成果。我试图避免任何形式的重复。
    • 嗯。当您单击按钮时。你是怎么做的?点击非常快?多次点击?因此,您可以在完成后禁用手柄设置水果串的按钮,您可以再次启用按钮。如果在下一次随机之前没有更新排序和数组的时间块,您可以阻止按钮大约 500 毫秒或更长时间进行 1 次点击。
    • 只需单击按钮一次。它一直处于启用状态。用例应该是,当我单击“下一个水果”按钮时,下一个水果应该显示在标签上。
    【解决方案3】:

    我认为这会起作用,但我认为Time Complexity 可以是O(n),因为我假设randomElement 有可能每次都返回Apple 并且savedFruit 也是Apple,所以在这种情况下,Time Complexity 将是O(n)。更好的解决方法是从array 中删除该元素,因此,下次randomElement 肯定会有所不同。然后,一旦它不同,您可以附加旧的并删除当前的。我希望这对你有意义,但现在我认为这会起作用:

    let array = ["Apple","Banana","Orange","Pinapple", "Plum", "Pear"]
    var savedFruit = String()
    
    func fetchRandomFruit()  {
    
    if let fruit = array.randomElement() {
    
        if fruit != savedFruit  { //Here it will check if the last element is same as the new randomElement
            savedFruit = fruit
            fruitbox.text = savedFruit
         } else {
           fetchRandomFruit()
        }  
      }
    }
    
    
    @IBAction func fruitbutton(_ sender: UIButton) {
    
      fetchRandomFruit()
    }
    

    【讨论】:

    • 谢谢!但这仍然在重复一些成果。我试图避免任何形式的重复。
    • 如何对字符串进行排序,使其一一遍历所有水果。它不必是随机的。我只希望每个单词在单击按钮时只显示一次。
    • 那是一个不同的问题,你的问题没有重复。更新您的问题,我会更新我的答案,或者您可以发布一个新问题。
    【解决方案4】:

    使用fruitbox.text = array.randomElement() ?? "default value for if array is empty"。这不是保证不会重复,而是随机的。

    如果你想确保它不重复,使用这个

    var new = array.randomElement() ?? fruitbox.text
    while new == fruitbox.text {
        new = array.randomElement() ?? fruitbox.text
    }
    fruitbox.text = new
    

    如果数组为空,这个WILL会无限循环(直到崩溃)。

    【讨论】:

    • This is not guaranteed not to repeat, but is random. 好吧,操作确实要求非重复随机。
    • @ShamasS-ReinstateMonica 这就是为什么我提供了一个解决方案来解决他们对问题的解释。另一种可能的阅读方式是随机功能不起作用,所以我也解决了这个问题。
    • 谢谢!但这仍然在重复一些成果。我试图避免任何形式的重复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 2012-10-16
    相关资源
    最近更新 更多