Другие альтернативы, которые можно использовать для goto swift

Вот мой код:

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, случайный код должен перезапуститься.


person B.Kaan    schedule 13.03.2018    source источник
comment
Цикл while?   -  person Paulw11    schedule 13.03.2018
comment
@Ahmed F, пожалуйста, отмените свое редактирование. Это противоречит намерениям авторов. Автор хотел показать, что они хотели бы сделать, но Swift не поддерживает это. не видя замысла, трудно понять, чего хочет добиться автор   -  person Scriptable    schedule 13.03.2018
comment
@Scriptable да, мой плохой. Я это сделал.   -  person Ahmad F    schedule 13.03.2018
comment
@Moritz Абсолютно верно, мой плохой. Спасибо за заметку :)   -  person Ahmad F    schedule 13.03.2018


Ответы (3)


Вы можете использовать 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
person Milan Nosáľ    schedule 13.03.2018
comment
Хотя этот ответ кажется типичным, знаете ли вы, что будет отличаться при сравнении с мой? скажем, по производительности... - person Ahmad F; 13.03.2018
comment
@AhmadF ваш рекурсивный, а это итеративный подход, поэтому я думаю, что он должен работать лучше - person Reinier Melian; 13.03.2018
comment
@AhmadF в целом рекурсия имеет более низкую производительность, чем циклы, поскольку рекурсия требует вызова метода n раз, что означает создание записи в стеке вызовов n раз... см., например: stackoverflow.com/questions/9386375/ или en.wikipedia.org/wiki/Call_stack - person Milan Nosáľ; 13.03.2018
comment
это сработало! благодарю вас. но есть еще одна проблема. Что я могу сделать для скрытой кнопки, чтобы она снова не скрылась? - person B.Kaan; 13.03.2018

В дополнение к repeat-while решению Милана, вы также можете добиться этого путем реализации рекурсии функций, давайте предположим, что ваша функция должна называться 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
    }
}
person Ahmad F    schedule 13.03.2018

Вот функциональная версия. Первая строка получает индексы всех кнопок, которые не имеют 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

Возможно, потребуется некоторая настройка, потому что она полностью не проверена.

person JeremyP    schedule 13.03.2018