Случайный выбор объекта из массива без повторения объектов подряд без удаления

Я новичок в Swift и пробовал разные способы заставить это работать.

У меня есть объект массивов, которые были созданы внутри viewController внутри метода viewDidLoad(). Внутри 5 предметов.

var objectss: [CustomClass] = [] // Five objects are created inside viewDidLoad() and added to this array

Индекс каждого объекта начинается с 0 до 4

У меня есть кнопка IBAction, которая случайным образом выбирает один из объектов внутри массива классов.

Также отмечу, что у каждого объекта есть кнопка (это означает, что у меня есть 6 кнопок на контроллере представления с тегом для каждой, начиная с 0 и увеличивая до 5)

Итак, чтобы объяснить, почему есть 5 вместо того, чтобы остановиться на 4, я подключил эти кнопки к одному IBAction и использовал переключатель, который имеет два случая. Первый случай — 0, 1, 2, 3, 4 и присваивает ссылку на переменную класса, созданную сверху, равным объектам [sender.tag], поэтому, если пользователь нажимает первую кнопку (тег = 0), он отображает информацию об объекте в индекс 0 (внутри массива) для отображения в следующую секундуViewController

Второй случай - 5, который представляет собой случайную кнопку, которая случайным образом получает объект из массива и отображает информацию об этом объекте на следующем втором ViewController.

Поэтому я надеюсь, что использование sender.tag для определения того, какая кнопка нажата, имеет смысл.

Внутри @IBAction я сделал это:

switch sender.tag {
    case 0, 1, 2, 3, 4:
         objectSelected = objectss[sender.tag]
    case 5:
        let index = Int(arc4random_uniform(4))
        var random: Int
        repeat{
            random = Int(arc4random_uniform(4))
        } while index == random

        objectSelected = objectss[random]
    default:
        break
 }

Я пытался сделать это таким образом, чтобы перестать получать один и тот же объект подряд, но он все еще делает это, и иногда требуется вечность для отображения некоторых других объектов во втором ViewController.

я тоже уже пробовал

let index = Int(arc4random_uniform(UInt32(objectss.count)))
objectSelected = objectss[index]

Но это продолжало показывать один и тот же объект подряд много раз


person Community    schedule 27.08.2017    source источник
comment
В чем вопрос?   -  person matiastofteby    schedule 27.08.2017


Ответы (1)


Я действительно не знаю, что вы пытаетесь сделать в case 5 переключателя, но чтобы избежать получения одного и того же объекта в строке, вы можете сохранить последний выбранный объект и продолжать генерировать новый номер, пока сгенерированный номер является такой же, как последний выбранный.

Итак, объявите эту переменную на уровне класса:

var lastSelectedObjectIndex = -1

В case 5 сделайте так:

var random = Int(arc4random_uniform(4))
while random == lastSelectedObjectIndex {
    random = Int(arc4random_uniform(4))
}
lastSelectedObjectIndex = random
objectSelected = objectss[random]
person Sweeper    schedule 27.08.2017
comment
Случай 5 — это случайная кнопка, означающая, что тег случайной кнопки равен 5, поэтому, если я нажимаю случайную кнопку, вместо первого случая запускается случай 5. Имеет ли это смысл? - person ; 27.08.2017
comment
@Panda Да, я знаю эту часть. Я просто смущен тем, как вы пытались решить эту проблему с повторяющимися объектами подряд. Я не совсем понимаю, что делает цикл repeat...while в вашем коде. Но эй, мой код должен работать сейчас. Если это сработает, рассмотрите возможность принятия моего ответа, нажав на эту галочку! - person Sweeper; 27.08.2017
comment
Это сработало, но после нескольких попыток он начал отображать один и тот же объект подряд. Неужели невозможно добраться до случайного выбора без отображения одного и того же объекта в строке? - person ; 27.08.2017
comment
Вы правильно используете мой код? Можете ли вы отредактировать вопрос, чтобы показать, как вы использовали мой код? Я всегда обновлял свой код, так как находил в нем ошибку. Пожалуйста, посмотрите. @Панда - person Sweeper; 27.08.2017
comment
В итоге немного поменял, но все заработало. Спасибо!! - person ; 27.08.2017