如何在Swift中生成1到75之间每10秒重复一次的随机数

时间:2017-06-24 19:29:37

标签: swift

我在Swift中有以下代码试图将一个简单的随机数生成器作为游戏的模拟器。

describe("Produce the reverse order of a word: ", function () {
  describe("Case for en empty string", function() {

    it("should return null for empty string", function() {
      expect(reverseString('')).toEqual(null);
    });

  });

  describe("Case for palindromes", function() {

    it("should return true for `anna`", function() {
      expect(reverseString('anna')).toEqual(true);
    });

    it("should return true for `NaN`", function() {
      expect(reverseString('NaN')).toEqual(true);
    });

    it("should return true for `civic`", function() {
      expect(reverseString('civic')).toEqual(true);
    });

  });

  describe("Case for normal words", function() {

    it("should return `skoob` for `books`", function() {
      expect(reverseString('books')).toEqual('skoob');
    });

    it("should return `nomolos` for `solomon`", function() {
      expect(reverseString('solomon')).toEqual('nomolos');
    });

    it("should return `csim` for `misc`", function() {
      expect(reverseString('misc')).toEqual('csim');
    });

  });

});

我是编程Swift的新手,但我知道使用var randomNumber = 0 override func viewDidLoad() { super.viewDidLoad() randomNumber = Int(arc4random_uniform(74) + 1) label.text = "\(randomNumber)" } timer()来使用计时器功能,但我不知道如何实现并使它成为一个新的数字出现在每隔10秒标记一次。谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

使用Timer,间隔为10秒,从numbers数组中提取新数字。从阵列中删除号码,这样您就不会拨打两次相同的号码。按下stop按钮,或者您没有号码时,请invalidate上的timer停止播放。

class BingoCaller: UIViewController {
    @IBOutlet weak var label: UILabel!

    var numbers = Array(1...75)
    let letters = ["B", "I", "N", "G", "O"]
    var timer: Timer?

    override func viewDidLoad() {
        timer = Timer.scheduledTimer(withTimeInterval: 10, repeats: true) { timer in
            let index = Int(arc4random_uniform(UInt32(self.numbers.count)))
            let number = self.numbers.remove(at: index)
            self.label.text = "\(self.letters[(number - 1) / 15])-\(number)"
            if self.numbers.isEmpty {
                timer.invalidate()
            }
        }
    }

    @IBAction func stop(_ button: UIButton) {
        timer?.invalidate()
    }
}

有关后续步骤的建议:

  1. 将已拉出的数字添加到第二个数组。使用该数组填充tableView,以便Gran能够在有人调用“Bingo!”时查看数字。
  2. 使用AVSpeechSynthesizer让iPhone真正说出数字。
  3. 添加重置按钮以开始新游戏。将numbers初始化为Array(1...75),将calledNumbers初始化为[],然后重新开始。将Timer循环移动到其自己的函数是一个好主意,以便可以从start按钮调用它。

答案 1 :(得分:0)

您可以定义辅助数组,以便检查是否已返回该数字:

var array = [Int]()
var timer: Timer?

override func viewDidLoad() {
    super.viewDidLoad()

    timer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(ViewController.timerFunction), userInfo: nil, repeats: true)
}

func timerFunction(){
    var n = arc4random_uniform(75) + 1
    while array.contains(Int(n)){
        n = arc4random_uniform(75) + 1
    }
    array.append(Int(n))
    label.text = String(n)
    if array.count == 75{
        timer?.invalidate()
    }
}

通过这种方式,您可以确保在使用了所有数字后计时器失效,并避免索引删除错误。