Swift - 从一个数组中随机获取一个、或多个元素(附样例)
在日常开发中,我们有时需要从一个指定数组中抽取随机元素(或者说样本元素)。比如从一个文章列表数组中随机展示一篇文章,又或是从一个颜色数组中随机获取几个颜色......下面通过样例演示如何实现这个功能。
(2)运行结果如下:
1,扩展 Array
为了方便使用,我们首先对数组(Array)进行扩展(Array+.swift),增加如下两个属性和方法:
- sample:从当前数组中返回一个随机元素
- sample(size, noRepeat):从当前数组中从返回指定个数的随机元素
import Foundation extension Array { /// 从数组中返回一个随机元素 public var sample: Element? { //如果数组为空,则返回nil guard count > 0 else { return nil } let randomIndex = Int(arc4random_uniform(UInt32(count))) return self[randomIndex] } /// 从数组中从返回指定个数的元素 /// /// - Parameters: /// - size: 希望返回的元素个数 /// - noRepeat: 返回的元素是否不可以重复(默认为false,可以重复) public func sample(size: Int, noRepeat: Bool = false) -> [Element]? { //如果数组为空,则返回nil guard !isEmpty else { return nil } var sampleElements: [Element] = [] //返回的元素可以重复的情况 if !noRepeat { for _ in 0..<size { sampleElements.append(sample!) } } //返回的元素不可以重复的情况 else{ //先复制一个新数组 var copy = self.map { $0 } for _ in 0..<size { //当元素不能重复时,最多只能返回原数组个数的元素 if copy.isEmpty { break } let randomIndex = Int(arc4random_uniform(UInt32(copy.count))) let element = copy[randomIndex] sampleElements.append(element) //每取出一个元素则将其从复制出来的新数组中移除 copy.remove(at: randomIndex) } } return sampleElements } }
2,使用样例
(1)样例代码
import UIKit class ViewController: UIViewController{ override func viewDidLoad() { super.viewDidLoad() let arr = [1, 2, 3, 4, 5] print("原始数组:", arr) print("\n--- 随机获取1个元素 --") print("第1次:\(arr.sample!)") print("第2次:\(arr.sample!)") print("第3次:\(arr.sample!)") print("第4次:\(arr.sample!)") print("第5次:\(arr.sample!)") print("\n--- 随机获取3个元素(可以重复) --") print("第1次:\(arr.sample(size: 3)!)") print("第2次:\(arr.sample(size: 3)!)") print("第3次:\(arr.sample(size: 3)!)") print("第4次:\(arr.sample(size: 3)!)") print("第5次:\(arr.sample(size: 3)!)") print("\n--- 随机获取3个元素(不可以重复) --") print("第1次:\(arr.sample(size: 3, noRepeat: true)!)") print("第2次:\(arr.sample(size: 3, noRepeat: true)!)") print("第3次:\(arr.sample(size: 3, noRepeat: true)!)") print("第4次:\(arr.sample(size: 3, noRepeat: true)!)") print("第5次:\(arr.sample(size: 3, noRepeat: true)!)") } }
(2)运行结果如下:
一直看你的文章,这么长时间都能坚持更新,太厉害了