Swift类中随机选取任意分类下单个Sign元素的实现问题
解决方案
要实现从所有分类的Sign中随机选取一个并打印其code,你需要先把所有分类下的Sign合并成一个统一数组,再从中随机选取元素,而非逐个分类覆盖变量。
正确代码实现
var randomSign: Sign? // 用可选型避免空数组场景下的崩溃 func pickRandomSign() { // 将所有分类中的Sign合并为一个数组 let allSigns = categories.flatMap { $0.sign } // 从合并后的数组中随机选取一个元素 randomSign = allSigns.randomElement() // 打印选中的code(处理可选值,防止空数组时出错) if let selectedSign = randomSign { print(selectedSign.code) } else { print("没有可选择的Sign") } }
原代码问题说明
你之前的for循环会遍历每个分类,每次都把randomSign替换为当前分类的随机Sign,循环结束后只会保留最后一个分类的随机结果,自然无法实现从所有Sign中随机选一个的需求。
补充说明
如果不需要严格保证每个Sign的选中概率完全均等,也可以先随机选一个分类,再从该分类中随机选Sign,代码如下:
func pickRandomSignAlternative() { if let randomCategory = categories.randomElement(), let selectedSign = randomCategory.sign.randomElement() { print(selectedSign.code) } else { print("没有可选择的Sign") } }
这种方式的缺点是:如果不同分类的Sign数量不同,选中数量少的分类里的Sign概率会更高。
内容的提问来源于stack exchange,提问作者krzychug
相关产品推荐
相关产品推荐

