在Swift中,有没有一种方法可以从函数列表中随机选择具有多个返回类型的函数?

时间:2019-02-15 03:09:46

标签: swift xcode

我希望能够随机选择这些函数以供以后调用,这样我可以得到各种问题,例如加法问题,乘法问题等等。我以前使用过此方法,但仅用于特定的返回类型,并且使用的不是很多。我想知道是否有人知道如何制作它,以便可以多次使用它。我不想只调用函数的某些部分,因为我需要每个部分都可以使游戏正常工作。我仅用additionalQuestions测试了游戏,它的工作方式与我想要的一样。现在我希望能够更改问题,而不仅仅是添加问题,因此是随机函数。

// this is one of the functions I'm trying to randomly choose but all of them
// have the same returns
// function 1: 

    func additionQuestions() -> (String, Void, Void, Void) {
    var sum : Int = 0
    let firstNumberGen = Int.random(in: 0 ... 100)
    let secondNumberGen = Int.random(in: 0...100)
    questionLabel.text = "\(firstNumberGen) + \(secondNumberGen)"
    makeQuestionVar = questionLabel.text!
    print(makeQuestionVar)
    sum = firstNumberGen + secondNumberGen
    print(sum)
    answerInString = trueCorrectAnswerButton.setTitle( String(sum), for: .normal)

    if sum >= 20 {
        falseAnswer1 = falseWrongAnswerButton.setTitle(String(sum - (Int.random(in: 1 ... 10))), for: .normal)
        falseAnswer2 = falseWrongButton2.setTitle(String(sum - (Int.random(in: 1 ... 10))), for: .normal)
    } else if sum < 20  && sum >= 10 {
        falseAnswer1 = falseWrongAnswerButton.setTitle(String(sum - (Int.random(in: 1 ... 5))), for: .normal)
        falseAnswer2 = falseWrongButton2.setTitle(String(sum - (Int.random(in: 1 ... 5))), for: .normal)
    } else {
        falseAnswer1 = falseWrongAnswerButton.setTitle(String(sum - (Int.random(in: 1 ... 2))), for: .normal)
        falseAnswer2 = falseWrongButton2.setTitle(String(sum - (Int.random(in: 1 ... 2))), for: .normal)
    }



    return (makeQuestionVar, answerInString, falseAnswer1, falseAnswer2)
}

// this is the random function:

   func randomQuestions () -> () -> (String, Void, Void, Void) {
    let questions = [self.additionQuestions(), self.subtractionQuestions(), self.multiplicationQuestions()]
    let random = Int(arc4random_uniform(UInt32(questions.count)))
    return questions[random]

2 个答案:

答案 0 :(得分:0)

好吧,我知道了,我真的不需要上面发布的内容。我不知道为什么我以前没有想到这个,但是……这就是我所拥有的:

func randomQuestions() {
    let mathCase = Int.random(in: 0 ... 2)

    if mathCase == 0 {
        additionQuestions()
    } else if mathCase == 1 {
        subtractionQuestions()
    } else if mathCase == 2 {
        multiplicationQuestions()
    }
}

这适用于我需要对我的应用做的事情

答案 1 :(得分:0)

您对自己的问题的回答...

func randomQuestions() {
    let mathCase = Int.random(in: 0 ... 2)
    if mathCase == 0 {
        additionQuestions()
    } else if mathCase == 1 {
        subtractionQuestions()
    } else if mathCase == 2 {
        multiplicationQuestions()
    }
}

...是解决此问题的糟糕方法。您应该以一种快速的方式,并且以一种可概括的方式来执行此操作。在Swift中,职能是一等公民。因此,您可以创建它们的数组并随机选择该数组的元素,然后调用它。然后您所有的硬编码名称和数字都消失了:

func callRandFunction(_ fs:[()->()]) {
    if let f = fs.randomElement() {
        f()
    }
}

这是在特定用例中调用它的方法:

callRandFunction([additionQuestions, subtractionQuestions, multiplicationQuestions])