可以用于goto swift的其他替代方案

时间:2018-03-13 10:26:04

标签: ios swift goto

这是我的代码:

func deneme() {

    var buttons: [UIButton] = [buttonA,buttonB,buttonC,buttonD,buttonE]

    let randomNumber = Int(arc4random_uniform(UInt32(buttons.count)))
    let button = buttons.remove(at: randomNumber)

    if button.titleLabel?.text == cevapLabel.text {

    }
    else {
        button.isHidden = true
    }
}

我想在if语句中使用这些代码。如果swift有goto,我可以编写如下代码:

    var buttons: [UIButton] = [buttonA,buttonB,buttonC,buttonD,buttonE]
    A:
    let randomNumber = Int(arc4random_uniform(UInt32(buttons.count)))
    let button = buttons.remove(at: randomNumber)

    if button.titleLabel?.text == cevapLabel.text {
       goto A
    }
    else {
      button.isHidden = true
    }

代码的目的:隐藏按钮。如果数组中按钮的文本等于cevapLabel.text,则应重新启动随机代码。

3 个答案:

答案 0 :(得分:2)

您可以使用repeat-while

var buttons: [UIButton] = [buttonA,buttonB,buttonC,buttonD,buttonE]
var currentButton: UIButton?
repeat {
    let randomNumber = Int(arc4random_uniform(UInt32(buttons.count)))
    currentButton = buttons.remove(at: randomNumber)
} while currentButton?.titleLabel?.text == cevapLabel.text

currentButton?.isHidden = true

答案 1 :(得分:0)

除了repeat-while Milan's solution之外,您还可以通过实现函数递归来实现它,我们假设您的函数应该命名为showOrHide()

var buttons: [UIButton] = [buttonA,buttonB,buttonC,buttonD,buttonE]

showOrHide()

func showOrHide() {
    let randomNumber = Int(arc4random_uniform(UInt32(buttons.count)))
    let button = buttons.remove(at: randomNumber)

    if button.titleLabel?.text == cevapLabel.text {
       showOrHide()
    }
    else {
      button.isHidden = true
    }
}

答案 2 :(得分:0)

这是一个功能版本。第一行获取没有cevapLabel.text作为标签的所有按钮的索引。然后,从结果数组中选择一个索引,并删除包含该索引的项目。

let eligibleIndexes = buttons.enumerated()
                          .filter{ $0.1.titleLabel?.text ?? "" != cevapLabel.text }
                          .map{ $0.0 }
let indexToGo = eligibleIndexes[Int(arc4random_uniform(UInt32(eligibleIndexes.count)))]
let CurrentButton = buttons.remove(at: indexToGo)
currentButton.isHidden = true

可能需要进行一些调整,因为它完全未经测试。