我目前正在尝试让我的两个阵列保持同步。一个问题标签和一个文本标签..
对于我的问题标签,我使用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()
}
我知道这可能是一个愚蠢的问题,但我浪费了一周的时间来试图解决这个问题......鼓励任何帮助!考虑使用闭包来解决问题,但实际上并不知道如何实现它。
答案 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]
}