Как рандомизировать массив в Swift (Xcode) - PullRequest
0 голосов
/ 04 мая 2020

Я делаю приложение для викторины в Swift, и мой вопрос в том, как я могу выбрать 3 случайных вопроса из моего массива, в котором есть 6 вопросов, потому что я планирую добавить около 900 вопросов, и я не хочу, чтобы каждый из них отображался мне понадобится только 30 случайных из них.

Вот изображение, как оно выглядит: code

class QuestionBank {

var list = [Questions]()

init() {
    list.append(Questions(questionImage: "Parking", questionText: "Дополнителната табла поставена под сообраќајниот знак означува:", choice1: "Положба при паркирање на возилото на коловоз", choice2: "Место на кое паркирањето не е дозволено", choice3: "Место на кое паркирањето е временски ограничено", correctanswer: 1))
    list.append(Questions(questionImage: "Policaec", questionText: "Положбата на телото и рацете на униформираниот полициски службеник (како на сликата), означува забрането минување:", choice1: "на возилата кои доаѓаат од насока на бочните страни", choice2: "на возилата кои доаѓаат од насока на грбот и градите", choice3: "на сите возила", correctanswer: 2))
    list.append(Questions(questionImage: "policaec2", questionText: "Според положбата на телото и рацете на униформираниот полициски службеник како на сликата , забрането е минување на:", choice1: "сите возила", choice2: "возилата кои доаѓаат од насока на бочните страни", choice3: "возилата кои доаѓаат од насока на грбот и градите", correctanswer: 3))
    list.append(Questions(questionImage: "semafor", questionText: "Според светлосниот знак на уредот за давање на светлосни сообраќајни знаци (прикажан на сликата):", choice1: "не може да свртите десно, бидејќи нема дополнителна зелена светлечка стрелка", choice2: "имате дозволен премин во сите правци", choice3: "имате дозволен премин само во насока право", correctanswer: 2))
    list.append(Questions(questionImage: "Stop", questionText: "Според начинот на кој е регулиран сообраќајот на крстосницата како на сликата, возачот е должен:", choice1: "да го запре возилото", choice2: "да запре со возилото само доколку има стоп линија", choice3: "да продолжи со движењето", correctanswer: 1))
    list.append(Questions(questionImage: "Dolzina", questionText: "Дополнителната табла поставена под сообраќајниот знак означува:", choice1: "Место каде сообраќајот се одвива во насока на прикажаните стрелки", choice2: "Оддалеченост од место каде започнуваат работите на патот", choice3: "Должина на дел од патот на кој што се изведувааат работи на патот", correctanswer: 3))
}

Это класс QuestionBank

class Questions {
let image: String
let prasanje: String
let odgovor1: String
let odgovor2: String
let odgovor3: String
let tocenodgovor: Int

init(questionImage: String, questionText: String, choice1: String, choice2: String, choice3: String, correctanswer: Int){
    image = questionImage
    prasanje = questionText
    odgovor1 = choice1
    odgovor2 = choice2
    odgovor3 = choice3
    tocenodgovor = correctanswer
}

Это класс вопросов

И если вы знаете, как я могу рандомизировать данные варианты, которые тоже будут полезны!

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

ОБНОВЛЕННЫЙ ОТВЕТ С НОВЫМ ПОСТАВЛЕННЫМ КОДОМ OP:

Вам потребуется реализовать Equatable в вашем классе Questions, чтобы iOS мог сравнивать элементы. Обычно это делается с помощью свойства id. Я обновил ваш класс здесь:

class Questions: Equatable {
    static func == (lhs: Questions, rhs: Questions) -> Bool {
        return lhs.id == rhs.id
    }

    let id: Int
    let image: String
    let prasanje: String
    let odgovor1: String
    let odgovor2: String
    let odgovor3: String
    let tocenodgovor: Int

    init(questionId: Int, questionImage: String, questionText: String, choice1: String, choice2: String, choice3: String, correctanswer: Int){
        id = questionId
        image = questionImage
        prasanje = questionText
        odgovor1 = choice1
        odgovor2 = choice2
        odgovor3 = choice3
        tocenodgovor = correctanswer
    }
}

Я обновил ваш класс QuestionBank, чтобы иметь общий синглтон, чтобы вы могли получить к нему доступ из любого места.

class QuestionBank {

    var list = [Questions]()
    static var shared = QuestionBank()

    init() {
        list.append(Questions(questionId: 1, questionImage: "Parking", questionText: "Дополнителната табла поставена под сообраќајниот знак означува:", choice1: "Положба при паркирање на возилото на коловоз", choice2: "Место на кое паркирањето не е дозволено", choice3: "Место на кое паркирањето е временски ограничено", correctanswer: 1))
            list.append(Questions(questionId: 2, questionImage: "Policaec", questionText: "Положбата на телото и рацете на униформираниот полициски службеник (како на сликата), означува забрането минување:", choice1: "на возилата кои доаѓаат од насока на бочните страни", choice2: "на возилата кои доаѓаат од насока на грбот и градите", choice3: "на сите возила", correctanswer: 2))
            list.append(Questions(questionId: 3, questionImage: "policaec2", questionText: "Според положбата на телото и рацете на униформираниот полициски службеник како на сликата , забрането е минување на:", choice1: "сите возила", choice2: "возилата кои доаѓаат од насока на бочните страни", choice3: "возилата кои доаѓаат од насока на грбот и градите", correctanswer: 3))
            list.append(Questions(questionId: 4, questionImage: "semafor", questionText: "Според светлосниот знак на уредот за давање на светлосни сообраќајни знаци (прикажан на сликата):", choice1: "не може да свртите десно, бидејќи нема дополнителна зелена светлечка стрелка", choice2: "имате дозволен премин во сите правци", choice3: "имате дозволен премин само во насока право", correctanswer: 2))
            list.append(Questions(questionId: 5, questionImage: "Stop", questionText: "Според начинот на кој е регулиран сообраќајот на крстосницата како на сликата, возачот е должен:", choice1: "да го запре возилото", choice2: "да запре со возилото само доколку има стоп линија", choice3: "да продолжи со движењето", correctanswer: 1))
            list.append(Questions(questionId: 6, questionImage: "Dolzina", questionText: "Дополнителната табла поставена под сообраќајниот знак означува:", choice1: "Место каде сообраќајот се одвива во насока на прикажаните стрелки", choice2: "Оддалеченост од место каде започнуваат работите на патот", choice3: "Должина на дел од патот на кој што се изведувааат работи на патот", correctanswer: 3))
    }

    func getRandomQuestions(_ amount: Int) -> [Questions] {
        var randomQuestions = [Questions]()
        while randomQuestions.count < amount {
            let randomIndex = Int.random(in: 0 ... list.count - 1)
            if randomQuestions.contains(list[randomIndex]) == false {
                randomQuestions.append(list[randomIndex])
            } else {
                print("randomQuestions already contains this question.")
            }
        }
        return randomQuestions
    }
}

Сейчас в В вашем ViewController (или в любом месте приложения) вы можете получить любое количество случайных вопросов с помощью одной строки кода:

    let randomQuestions = QuestionBank.shared.getRandomQuestions(3)

    // this is some simple test code or you to print your random questions id and text
    for question in randomQuestions {
        print(question.id)
        print(question.prasanje)
    }
1 голос
/ 04 мая 2020

Выбор 3 (неповторяющихся) вопросов. Сохраняет их в массиве

var setOfQuestions: Set<String> = ["Question 1..", "Question 2..", "Question 3.."]
let howMany = 3
var pickedQuestions = [String]()

for i in 1...3 {
   let picked = setOfQuestions.randomElement()!
   pickedQuestions.append(picked)
   setOfQuestions.remove(picked)
}

. Если вы хотите, чтобы массив был перетасован, вы можете сделать это (кстати, множества всегда перетасовываются)

[1, 2, 3, 4].shuffled()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...