система текстовых вопросников — swift 3

#swift #text

#swift #текст

Вопрос:

Этот вопрос касается построения системы текстовых анкет с использованием swift 3. Предполагая, что у нас есть (n) вопросов, пользователю будет задаваться по одному вопросу за раз, отвечая текстом (используя UITextField). если ответ соответствует ожидаемому (например, ДА / НЕТ), код перейдет к следующему вопросу, в противном случае он попытается задать более сложный вопрос с возможными ответами (см. Код ниже).

Идея заключается в том, чтобы иметь какой-то массив словарей, каждый словарь (questionItem) содержит данные одного вопроса / ответа…

Вопрос: даже если следующий код работает нормально, я чувствую, что это не самое масштабируемое и элегантное решение. Таким образом, мой вопрос больше касается ваших идей относительно дизайна кода. как можно создать такой код, который можно масштабировать для нескольких вопросов.

 static var questionItem = [
    "question": "Is the sky blue?",
    "answer": "yes",
    "afterAnswer": "question #2",
    "explanation": "simply answer: yes or no"
]



class func getAnswer(answer: String) -> String
{
    let expectedAnswer = questionItem["answer"]
    let isEqual = (answer == expectedAnswer)

    var respond = "undifined"

    if isEqual {
        // go for next question  ( questionItem["afterAnswer"] )
        respond = "ok, going to the next question"
    } else {
        // didn't got the answer I was waiting for, going to show some longer explanation
        respond = questionItem["explanation"]!

    }
   // respond
    return respond
}
 

Ответ №1:

Вы можете создать структуру с желаемой информацией, а затем создать элементарные данные типа Int: YourStruct для управления всеми различными вопросами, ответами и объяснениями, как в моем примере ниже, дайте мне знать, достаточно ли это ясно:

 struct  QuestionsAndAnswers{

    var question: String = ""
    var answer: String = ""
    var explanation: String = ""

}

var trivia: [Int: QuestionsAndAnswers] = [:]

trivia = [1: QuestionsAndAnswers.init(question: "Your First Question", answer: "Your Fist Answer", explanation: "Your First explanation")]

trivia = [2: QuestionsAndAnswers.init(question: "Your Second Question", answer: "Your Second Answer", explanation: "Your Second explanation")]

func getAnswer(answer: String, quesiontNumber: Int) -> String
{
    let expectedAnswer = trivia[quesiontNumber]?.answer
    let isEqual = (answer == expectedAnswer)

    var respond = "undifined"

    if isEqual {
        // go for next question  ( questionItem["afterAnswer"] )
        respond = "ok, going to the next question"
    } else {
        // didn't got the answer I was waiting for, going to show some longer explanation
        respond = (trivia[quesiontNumber]?.explanation)!

    }
    // respond
    return respond
}
 

Комментарии:

1. Спасибо, Наго, все еще ваш код перенастраивает ошибку: ожидаемое объявление в строке ниже: var trivia: [Int: QuestionsAndAnswers] = [:]

2. используете ли вы swift 3? Я пробую это на игровой площадке, и у меня нет никаких проблем!

3. И вы объявили структуру QuestionsAndAnswers? ссылка на изображение По этой ссылке вы можете увидеть изображение кода без ошибок.