Swift数组随机元素选取异常:Xcode仅返回元素索引而非目标元素
解决Swift数组随机元素的两个问题
嘿,刚好我对Swift数组的随机操作很熟悉,来帮你搞定这两个问题!
问题1:无法从数组中选取随机元素
从Swift 4.2开始,数组原生就提供了randomElement()方法,专门用来获取随机元素,非常好用。不过要注意,这个方法返回的是可选值——如果数组是空的,它会返回nil,所以我们需要用可选绑定来处理:
let fruits = ["苹果", "香蕉", "草莓", "芒果"] if let randomFruit = fruits.randomElement() { print("抽到的随机水果:\(randomFruit)") } else { print("数组是空的,没法抽取随机元素哦") }
如果你的项目还在使用低于Swift 4.2的版本(现在应该很少见了),可以自己写一个扩展来实现:
extension Array { func randomElementCompat() -> Element? { guard !isEmpty else { return nil } let randomIndex = Int(arc4random_uniform(UInt32(count))) return self[randomIndex] } }
问题2:返回索引而非元素本身
你遇到的这个情况,大概率是直接打印了随机生成的索引值,而没有用这个索引去数组里获取对应的元素。举个错误写法的例子:
let array1 = ["猫", "狗", "兔子"] let array2 = ["红色", "蓝色", "黄色"] // 错误:直接打印了索引,不是元素 let randomIdx1 = Int.random(in: 0..<array1.count) print(randomIdx1) // 输出的是0、1、2这类数字
正确的做法是用索引去数组中取值,或者更简单的直接用randomElement():
方法一:用randomElement()(推荐,更安全)
let array1 = ["猫", "狗", "兔子"] let array2 = ["红色", "蓝色", "黄色"] if let randomAnimal = array1.randomElement(), let randomColor = array2.randomElement() { print("随机动物:\(randomAnimal),随机颜色:\(randomColor)") } else { print("至少有一个数组是空的,无法完成随机选取") }
方法二:手动生成索引再取值
如果你习惯用索引的方式,记得一定要通过索引去访问数组元素,同时要先判断数组非空避免崩溃:
let array1 = ["猫", "狗", "兔子"] let array2 = ["红色", "蓝色", "黄色"] // 先检查数组是否为空 guard !array1.isEmpty, !array2.isEmpty else { print("数组不能为空!") return } let randomIdx1 = Int.random(in: 0..<array1.count) let randomAnimal = array1[randomIdx1] let randomIdx2 = Int.random(in: 0..<array2.count) let randomColor = array2[randomIdx2] print("随机动物:\(randomAnimal),随机颜色:\(randomColor)")
这里要特别提醒:如果数组为空的话,直接生成索引会导致崩溃(因为0..<0是无效范围),而randomElement()会自动返回nil,能更优雅地处理空数组场景,所以更推荐使用这个原生方法。
内容的提问来源于stack exchange,提问作者Mk Berou
相关产品推荐
相关产品推荐

