Swift-使用泛型范围获取数组或区间中随机元素
来源:互联网 发布:海尔软件待遇怎么样 编辑:程序博客网 时间:2024/06/05 10:49
实际开发中,通常会遇到获取一个随机数
- 随机产生一个数字
- 随机获取数组中的一个元素
- 随机获取一种颜色
- …
简单介绍:
一、最简单操作:给定一个最大值,随机获取一个0到最大值之间的数字
let int = arc4random_uniform(100)
二、从一个范围中返回一个随机数
不足:此方法只支持返回一个半开区间 (x..
// 使用 upperBound 和 lowerBound需要导入改头文件import Darwinfunc randomNumber(from range: Range<Int>) -> Int { let distance = range.upperBound - range.lowerBound let rnd = arc4random_uniform(UInt32(distance)) return range.lowerBound + Int(rnd)}
可以使用一个半开的区间调用这个函数
let random1 = randomNumber(from: 1..<10)
但是不能传入一个闭合的区间:
let random2 = randomNumber(from: 1...9) // error
三、随机获取字符数组中的一个元素,数组内元素必须是字符串
func randomStringFromArray(from array: Array<Any>) -> String { let index: Int = Int(arc4random_uniform(UInt32(array.count))) return array[index] as! String}
从一个字符数组中随机获取一个元素
let array = ["Mazy","Lucy","Lily","Vivian","Owen"]let element = randomStringFromArray(from: array)
四、利用泛型随机获取数组中的一个元素,数组内可以是任意元素
func randomElementFromArray<T>(from array: Array<T>) -> T { let index: Int = Int(arc4random_uniform(UInt32(array.count))) return array[index] }
从数组中随机返回元素
// 字符串数组let array = ["Mazy","Lucy","Lily","Vivian","Owen"]let element = randomElementFromArray(from: array)// 数字数组let array1 = [1,5,8,32,7,88,6] let num = randomElementFromArray(from: array1)
五、思考:有没有一个方法,传入区间或数组,返回一个随机元素?
通过识别基本接口编写通用代码
参考于霍曼·梅尔:How to be DRY on ranges and closed ranges?
当我们尝试从随机函数中筛选出基本接口,即所需实现的最小功能集合:
- 它需要一种有效的方法来计算输入序列的下限和上限之间的距离。
- 它需要一种有效的方式来检索输入序列的第 n 个元素以便将其返回,其中 n 是从其长度的下界计算得到的随机距离。
霍曼注意到两个可计数的区间类型都遵守协议 RandomAccessCollection ,共享该公共协议的一致性。事实上,RandomAccessCollection 提供了我们想要的基本接口:可随机访问的集合保证了所需开销时间都是恒定的,而这些开销主要集中在测量索引间距离以及访问任意索引所指向的元素。
因此,把 random 函数定义成 RandomAccessCollection 中的方法
// MARK: - 随机函数筛选元素extension RandomAccessCollection { func random() -> Iterator.Element? { guard count > 0 else { return nil } let offset = arc4random_uniform(numericCast(count)) let i = index(startIndex, offsetBy: numericCast(offset)) return self[i] }}
随机函数的使用
// 获取区间的中随机数let a = (50...100).random() // 闭区间let b = (0..<9).random() // 开区间let array = ["Mazy","Lucy","Lily","Vivian","Owen"]let name = array.random()
六、随机函数的高级使用
结合随机函数,给 UIColor 添加 extension 获取一个随机颜色
extension UIColor { static var randomColor: UIColor { get { let r: CGFloat = CGFloat((0...255).random()!)/255.0 let g: CGFloat = CGFloat((0...255).random()!)/255.0 let b: CGFloat = CGFloat((0...255).random()!)/255.0 // 或者使用一下原生函数获取随机数 /* let redValue = CGFloat(Int(arc4random() % 255)) / 255.0 let blueValue = CGFloat(Int(arc4random() % 255)) / 255.0 let greenValue = CGFloat(Int(arc4random() % 255)) / 255.0 */ return UIColor(red: r, green: g, blue: b, alpha: 1.0) } }}
获取随机颜色
let color = UIColor.randomColor
0 0
- Swift-使用泛型范围获取数组或区间中随机元素
- 3.3 Swift数组元素的访问和在数组中插入 或 增加元素
- 获取字符串或数组元素
- 生成有n个元素的随机数组 并设置随机元素的范围
- 数组中随机添加不重复元素
- swift中数组元素类型问题
- swift数组中添加不同类型元素
- 不重复地随机获取List或者数组元素
- 【Java】随机生成范围[min,max]之间的整数数组,且元素值不重复
- 数组元素随机排序
- 随机读取数组元素
- 2个数组中遍历相同元素或不同元素
- 随机访问数组中第i大的元素
- 如何从数组中随机选择任意个元素
- js随机从数组中取出几个元素
- php 关联数组中随机的取出一个元素
- php 从一个数组中随机取一个元素出来
- 随机获取一个集合(List, Set)中的元素,随机获取一个Map中的key或value
- ITween要点记录1-指定方法
- 欢迎使用CSDN-markdown编辑器
- 理解RESTful架构
- 前端必读:浏览器内部工作原理
- WHAT DOES “NEURONS THAT FIRE TOGETHER WIRE TOGETHER” MEAN?
- Swift-使用泛型范围获取数组或区间中随机元素
- Oracle数据库(数据字典、表空间、表的创建、视图)
- base64
- Netty学习之三--Java I/O模型
- 原型模式
- Intent 传递对象 Serializable/Parcelable
- 起步-封装组件
- Codeforces Round #413 Div. 1 + Div. 2 A. Carrot Cakes
- Oracle