随机洗牌的问题在哪里

时间:2020-04-10 22:00:22

标签: swift

我真的不知道如何整理答案。 我有许多按钮(buttonA,buttonB,buttonC)和各种答案

this.baseUrl + 'organizations/' + id

这个答案我必须放在每个按钮上,但不要放在同一位置。正确答案始终位于第一位置,因此在此刻,buttonA中的每个正确答案都是正确的。

错误1:类型“ RandomNumberGenerator.Protocol”不符合“ RandomNumberGenerator”;只有struct / enum / class类型可以符合协议

错误2:无法将'RandomNumberGenerator.Protocol'类型的不可变值作为inout参数传递

我以前从未使用过洗牌。很抱歉这个原始问题,但是我很快就开始了。谢谢

2 个答案:

答案 0 :(得分:3)

RandomNumberGenerator是一个协议,但是从字面上看,您不会将其用作参数,而是可能会提供符合该协议的对象。

但是您真的不需要为此担心。只需直接使用shuffled(或randomElement),而无需提供随机数生成器。如果您只想改组这三个子数组中的每一个,则可以这样做:

let answers = [
    ["30","20","10"],
    ["cat", "dog", "butterfly"],
    ["flower", "sun", "tree"]
].map { $0.shuffled() }

这将产生如下内容:

[
    ["20", "10", "30"], 
    ["dog", "cat", "butterfly"], 
    ["tree", "sun", "flower"]
]

然后您可以执行以下操作:

for (index, button) in buttons.enumerated() {
    button.setTitle(answers[numberOfQuestion][index], for: .normal)
}

请注意,我们在进入按钮循环之前已经将随机播放移动了,因为这将确保不会重复回答。但是,如果您想让答案重复,您可能根本不会洗牌,而只是抓住一个随机元素:

let answers = [
    ["30", "20", "10"],
    ["cat", "dog", "butterfly"],
    ["flower", "sun", "tree"]
]

for button in buttons {
    button.setTitle(answers[numberOfQuestion].randomElement(), for: .normal)
}

答案 1 :(得分:2)

let buttons = [UIButton(), UIButton(), UIButton()]
let answers = [
     ["30","20","10"],
     ["cat", "dog", "butterfly"],
     ["flower", "sun", "tree"]
 ]

let shuffledAnswers = answers.map { $0.shuffled() }

buttons.enumerated().forEach {
    let answer = shuffledAnswers[$0.offset].first
    $0.element.setTitle(answer, for: .normal)
}