Swift: Написание кода, который будет вызывать случайный элемент из массива и не будет вызывать этот элемент снова - PullRequest
0 голосов
/ 25 сентября 2019

Я пишу базовое приложение «Правда или вызов» как учебный проект, и у меня возникает проблема, когда я пытаюсь создать массив для истин / задач.Я хочу случайным образом вызвать вызов, но у меня не должно быть этого выбора, когда я снова вызываю метод.Я попытался использовать array.remove (at:), но затем столкнулся с проблемами с неизменяемыми классами / методами.

Любая помощь будет принята с благодарностью.

var wildDares = [
    "Wild Dare A",
    "Wild Dare B",
    "Wild Dare C",
    "Wild Dare D",
    "Wild Dare E"]

func randomWildDare() -> String {
    let randomNum = GKRandomSource.sharedRandom().nextInt(upperBound: wildDares.count)

    if wildDares.count == 1 {
        return "You're out of dares. Select a new pack or click 'New Game' in the menu section." } else {
            //wildDares.remove(at: randomNum)
            return wildDares[randomNum]
    }
}

1 Ответ

1 голос
/ 25 сентября 2019

Я вижу, что вы используете GameplayKit, чтобы перетасовать свои вызовы, но теперь встроено перемешивание, чтобы ускорить себя.

struct DareStore {
    private var dares: [String]
    init(dares: [String]) {
        self.dares = dares.shuffled()
    }

    mutating func next() -> String? {
        if dares.count > 0 {
            return dares.removeFirst()
        }
        return nil
    }
}

В этом DareStore вы видите, что мы предоставляем init массив массива вызовов, и мытам перетасуй.Теперь всякий раз, когда вызывается next (), он просто удаляет и возвращает первый из перемешанных вызовов, пока не останется больше.

var dares = DareStore(dares: ["1", "2", "3"])
while let dare = dares.next() {
    print(dare)
}
...