IOS Development(Swift):如果值存在,则取当前数组索引

时间:2018-03-22 12:08:49

标签: ios arrays swift xcode

我不确切地知道我在寻找什么,这就是为什么我要开一个新问题的原因。如果有其他问题得到解答,请将此问题标记为副本。

  

请理解我是IOS开发的新手,所以如果我写的东西   这不太对,请随意纠正我。

所以我的swift代码中有一个包含六个索引的数组。每个索引都有四个不同变量的值。例如,在我的QuestionBank课程中:

var list = [Question]()

init() {
 list.append(Question(text: "some Text", answerA: "answer a"), answerB: "answer b", selectedQuestionNumber: 1)
 list.append(Question(text: "some Text", answerA: "answer a"), answerB: "answer b", selectedQuestionNumber: 2)
 list.append(Question(text: "some Text", answerA: "answer a"), answerB: "answer b", selectedQuestionNumber: 3)
 list.append(Question(text: "some Text", answerA: "answer a"), answerB: "answer b", selectedQuestionNumber: 4)
 list.append(Question(text: "some Text", answerA: "answer a"), answerB: "answer b", selectedQuestionNumber: 5)
 list.append(Question(text: "some Text", answerA: "answer a"), answerB: "answer b", selectedQuestionNumber: 6)
}

我添加了selectedQuestionNumber以获得每个索引的唯一标识符。我不想使用每个索引的默认编号(allQuestions.list[questionNumber].questionText

所以我的问题如下:

如何使用selectedQuestionNumber作为标识符来获取第一个索引的值?

到目前为止我得到了这个:

if allQuestions.list[questionNumber].storyNumber == 1 {
  storyTextView.text = allQuestions.list[questionNumber].questionText
  topButton.setTitle(allQuestions.list[questionNumber].answerA, for: .normal)
  bottomButton.setTitle(allQuestions.list[questionNumber].answerB, for: .normal)
}

我评估storyNumber是否为1,但文本和答案不会被同一因素评估。我想让storyNumber评估所有内容。这意味着必须用其他内容替换[questionNumber]并给我一些属于storyNumber 1的文本和答案。

如果您需要有关代码和未定义的变量的更多信息(至少在这里,在我的项目中定义了它们),请随时询问。

祝你好运

2 个答案:

答案 0 :(得分:1)

您希望使用first(where: )。这是这样做的:

let question = list.first(where: { $0.selectedQuestionNumber == 1 })

您还可以按selectedQuestionNumber对数组进行排序:

let orderedList = list.sorted { $0.selectedQuestionNumber < $1.selectedQuestionNumber }

或者,变异版本:

list.sort { $0.selectedQuestionNumber < $1.selectedQuestionNumber }

然后您可以通过它们的数组索引访问它们。

除此之外,还有过滤器:

let question = list.filter { $0.selectedQuestionNumber == 3 }

但请注意,由于您在此上下文中使用它,结果仍然是数组。可能没有,一个或多个值保留。

答案 1 :(得分:0)

使用first(where: {$0.selectionNumber == VALUE})确实是你想要的,如果你只想直接前进。

由于你想自己索引数组,我建议你这样做。我重写了你的Question结构来代表我的设计:

public struct Question {
    let text: String
    let answerA: String
    let answerB: String

    init(_ text: String, _ answerA: String, _ answerB: String) {
        self.text = text
        self.answerA = answerA
        self.answerB = answerB
    }
}

class Test {

    var list: [Int : Question] = [:]

    init() {
        list[0] = Question("some text", "answer A", "Answer B")
        list[1] = Question("some text", "answer A", "Answer B")
        list[2] = Question("some text", "answer A", "Answer B")
        list[3] = Question("some text", "answer A", "Answer B")
        list[4] = Question("some text", "answer A", "Answer B")
        list[5] = Question("some text", "answer A", "Answer B")
    }
}

通过这种方式,您将使用可以自己编制索引的dictionary并以与数组相同的方式获取。 这样你就不必对其进行零索引,但是你可以从15开始上升,或者你可以使用负值。