保持两个阵列同步?

时间:2018-01-09 15:38:48

标签: ios arrays swift

我目前正在尝试让我的两个阵列保持同步。一个问题标签和一个文本标签..

对于我的问题标签,我使用arc4Random从我的数组中挑选一个随机问题。但是,为了在UI中将标签设置在它上方,我需要它来匹配我的其他数组..(titleQuestions)

如何使用我在问题数组中生成的titleQuestion号码来提取arc4random

提前抱歉,我对Swift相对较新,还在学习..第一年..

//just vars to get data from my two models(i.e two arrays)
var questionArray = DataModel()
var tArray = TitleLabel()

// this here is questions for the lower UI label. random No generate here!
func questions() {
     let questions = questionArray.questions
     let randomQuestions = questions.index(questions.startIndex , offsetBy : questions.count.arc4random)

     questionLabel.text = questions[randomQuestions]

}

// the questions marks is because I dont know what to index here because I want this number but cant seem to get it!
func titles() {

   let titlesArray = tArray.titleQuestions
   titleLabel.text = titlesArray[?????]

}

// When this button is pressed both UIlabel will be updated with a random question and the associated title
@IBAction func questionsButton(_ sender: UIButton) {
    questions()
    titles()
}

我知道这可能是一个愚蠢的问题,但我浪费了一周的时间来试图解决这个问题......鼓励任何帮助!考虑使用闭包来解决问题,但实际上并不知道如何实现它。

3 个答案:

答案 0 :(得分:2)

欢迎来到SO。这是一个微不足道的问题,一个你应该自己解决的问题,但听起来你被卡住了,所以我会怜悯你。

最简单的方法是,从提取项目的行中取出生成随机数的代码,然后将随机数分配给临时变量,并从单个函数中设置两个标签:

func questionsAndTitles() {
     let randomInt = Int(arc4random_uniform(Uint32(questions.count)))
     let questions = questionArray.questions
     questionLabel.text = questions[randomInt]
     let titlesArray = tArray.titleQuestions
     titleLabel.text = titlesArray[randomInt]
}

(假设questions的类型为Array,没有理由创建一个Index对象来从数组中获取一个项.Arrays允许整数下标。)

但是,创建包含问题和答案的结构数组可能更有意义。这样你就可以从你的数组中获取一个问答结构的实例,然后用它来填充这两个结构。

编辑:

如果要创建一个结构数组,它可能如下所示:

struct QuestionStruct {
  let question: String
  let possibleAnswers: [String]
  let correctAnswerIndex: int
}

var questions: [QuestionStruct] =
 [
    QuestionStruct(
      question: "What is the airspeed velocity of an unladen swallow?", 
      possibleAnswers: ["3 ft/sec", "2.2 ft/sec", "European or African"],
      correctAnswerIndex: 2),
    QuestionStruct(
      question: "What is Your favorite color?", 
      possibleAnswers: ["Blue", "Green", "Blue. No, Green! Ieee!"],
      correctAnswerIndex: 2)
 ]

//And then you might use code like this:

let randomIndex = Int(arc4random_uniform(UInt32(questions.count)))
let aQuestion = questions[randomIndex]

let correctAnswerIndex = aQuestion. correctAnswerIndex
questionLabel.text.text = aQuestion.question
correctAnswerLabel.text = aQuestion.possibleAnswers[correctAnswerIndex]

答案 1 :(得分:0)

您可以将挑选的随机数存储在类变量中,以便可以通过questions()和titles()方法访问它。

使用在类范围内声明的属性:

var lastRandomSeed: Int?

在两种方法中重复使用它:

if let lastRandomSeed = lastRandomSeed {
    let randomQuestions = questions.index(questions.startIndex , offsetBy : lastRandomSeed)
    lastRandomSeed = nil
} else {
    lastRandomSeed = questions.count.arc4random
    let randomQuestions = questions.index(questions.startIndex , offsetBy : lastRandomSeed)
}

和:

if let lastRandomSeed = lastRandomSeed {
    titleLabel.text = titlesArray[lastRandomSeed]
    lastRandomSeed = nil
} else {
    lastRandomSeed = questions.count.arc4random
    titleLabel.text = titlesArray[lastRandomSeed]
}

这也确保您可以按顺序调用方法。

更好的方法是重构代码,使用将更新视图的计算属性:

var lastRandomSeed: Int = -1 {
    didSet {
        let questions = questionArray.questions
        let randomQuestions = questions.index(questions.startIndex , offsetBy : lastRandomSeed)
        let titlesArray = tArray.titleQuestions

        questionLabel.text = questions[lastRandomSeed]
        titleLabel.text = titlesArray[lastRandomSeed]
    }
}

只需将其写入您的IBAction:

let questions = questionArray.questions
lastRandomSeed = questions.count.arc4random

答案 2 :(得分:0)

你必须先训练自己。尝试根据其目的命名变量,函数甚至局部变量。所以在任何时候你都可以理解这个变量/函数/类型是用来做什么的。

因此,在您的示例中,我可以假设DataModel类型是数组的子类,因为您将它的实例分配给变量questionArray。它不是很简单,但或多或​​少都可以(不过更好的是将它命名为DataArray)。但是那个看着你代码的人可以意识到你的数组不是数组。它是一个有一系列问题的对象。因此,您必须将其命名为let questionArrayHolder = DataModel()或填写问题:let questionArray = DataModel().questions

但是你将TitleLabel的实例分配给变量tArray。 t 可能意味着什么,它绝对不像数组。如果要创建包含单个对象的数组,请将其声明为titleArray = [TitleObjects]

然后你有function question()

它的名字自然表明它必须回答一些问题。但它什么也没有回报。如果您想生成问题名称,则可以使用func generateQuestions()。但是你的功能不会产生问题,它会提出一个问题并将其分配给标题。所以你的名字就像func pickupRandomQuestion()

您有很多机会在功能之间分享舒缓。在检索问题之前,您可以声明成员变量var selectedQuestion: Int? = 0并将arc4rand编号分配给它。

您可以在数组中找到问题的索引,假设所有问题都是唯一的,questions.index(of: questionLabel.text)

您可以从函数返回问题编号:

func pickupRandomQuestion() -> Int {
    let randNumber = questions.count.arc4random // I'm assuming that you have that function, and it works for you as you expect
     let randomQuestion = questions.index(questions.startIndex , offsetBy : randNumber)

    questionLabel.text = questions[randomQuestion]
    return randNumber
}

然后将其提供给其他功能

func pickupTitleForQuestion(at index: Int) {
    titleLabel.text = titlesArray[index]
}