确定Swift字典是否不包含键并设置默认值

确定Swift字典是否不包含键并设置默认值,swift,dictionary,Swift,Dictionary,我有一个测验应用程序,应用程序内用户可以选择答案或否。如果用户跳过没有答案的问题,我想为该问题添加字典0值。如果选择A,我为B添加1,添加2,以此类推,直到E。在我的问题1中,键:1->表示问题1,值:1->表示答案。如果用户选择我添加的字典。如果用户跳过而没有任何答案,我不会添加答案 userAnswerDict = [(key: 1, value: 4), (key: 2, value: 5), (key: 4, value: 4), (key: 6, value: 4), (key: 7

我有一个测验应用程序,应用程序内用户可以选择答案或否。如果用户跳过没有答案的问题,我想为该问题添加字典0值。如果选择A,我为B添加1,添加2,以此类推,直到E。在我的问题1中,键:1->表示问题1,值:1->表示答案。如果用户选择我添加的字典。如果用户跳过而没有任何答案,我不会添加答案

 userAnswerDict = [(key: 1, value: 4), (key: 2, value: 5), (key: 4, value: 4), (key: 6, value: 4), (key: 7, value: 5), (key: 9, value: 2)

我的问题从这里开始。我想为key=3、key=5、key=8添加默认值=0。我的问题总数是20。我该怎么做呢?

您可以像下面的代码一样轻松地为答案创建结构并对其进行管理:

struct Answer {
    var questionId: Int
    var answerValue: Int?
}

let answer1 = Answer(questionId: 1, answerValue: 5)
let answer2 = Answer(questionId: 2, answerValue: nil)

let arrAnswers = [answer1, answer2]
如果要将nil值替换为0,则可以使用以下函数:

let arrNewAnswers = arrAnswers.flatMap { (answer) -> Answer in
    if answer.answerValue == nil {
        return Answer(questionId: answer.questionId, answerValue: 0)
    }
    return answer
}
输出:

第一个数组包含nil值

printarrAnswers

[回答问题ID:1,回答值:可选5,回答问题ID:2,回答值:无]

第二个数组将0更新为零

printarrNewAnswers

[回答问题ID:1,回答值:可选5,回答问题ID:2,回答值:可选0]


我希望这将对您有所帮助。

如果您只使用一个用全部0初始化的整数数组,对我来说似乎更容易,例如:

var answers = [Int](repeating: 0, count: 20)
然后,当用户回答索引问题时,您只需执行以下操作:

answers[index] = userAnswer //A number based on the choices option
或者,您可以通过以下方式访问问题的答案:

userSaidForIndexQuestion = answers[index] //Will be 0 if you never add an answer

希望对您有所帮助。

字典实际上是一个元组数组。不鼓励您对持久数据使用元组。我的印象是,对于该任务,字典是错误的数据结构。为什么不使用var userAnswers=[Answer]之类的东西,而Answer可以是一个类或结构,甚至可以是一个带有case NoAnswer和GivenAnswerInt的枚举,并带有一个关联值。@vadian您的建议是什么?与luk2302相同s@luk2302,如何确定问题编号并给出答案?你们能解释一下你们的建议吗?我觉得我的回答是多余的。是的,我们可以删除它,因为答案允许为空值。