swift - 洗牌随机的问题在哪里
问题描述
我真的不知道,如何改组答案。我有按钮集合(buttonA、buttonB、buttonC)和 var 答案
let answer = [
["30","20","10"],
["cat", "dog", "butterfly"],
["flower", "sun", "tree"]
]
for i in 0..<buttons.count{
answer[i].shuffled(using: &RandomNumberGenerator)
buttons[i].setTitle(self.answer[self.numberOfQuestion][i], for: .normal) //this row is ok
}
这个答案我必须放入每个按钮,但不能放在同一个位置。正确答案总是在第一位,所以此时按钮A中的每一个正确答案都是正确的。
错误1:类型'RandomNumberGenerator.Protocol'不能符合'RandomNumberGenerator';只有结构/枚举/类类型可以符合协议
错误 2:无法将“RandomNumberGenerator.Protocol”类型的不可变值作为 inout 参数传递
我以前从未使用过洗牌。对不起这个原始问题,但我很快就开始了。谢谢
解决方案
TheRandomNumberGenerator
是一个协议,但你不会使用它作为参数,而是可能提供一个符合该协议的对象。
但是你真的不需要担心这个。只需直接使用shuffled
(or 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)
}
推荐阅读
- flutter - Flutter DropdownMenuItem 在单独的小部件文件中
- firebase - Firestore:慢查询
- sql - SQL - 选择数量相等的用户对
- javascript - 将表单数据保存在包含数组 [Angular] 的模态类中
- bazel - 如何从starlark中的字符串创建路径?
- xaml - UWP SplitView:在 PaneOpen 上推送内容而不是缩小它
- stripe-payments - 更改按钮文本 Stripe Checkout?
- php - 检查范围时间是否为新一天前后的 30 分钟
- json - Flutter json.decode() 在解析同一个对象时有时有效,有时无效
- sql - 向 SQL Server 中的 identity(1,1) 列添加值