Swift开发小技巧系列 - 随机数生成

原文链接

正文

在实际项目中,我们经常遇到一些需要取随机数的情况。

比如:我们想要一个随机颜色,这时候需要三个随机的,范围是0-255之间的RGB值

版本一:

let red = arc4random() % 256
let green = arc4random() % 256
let blue = arc4random() % 256

let color = UIColor(red: CGFloat(red)/255.0, green: CGFloat(green)/255.0, blue: CGFloat(blue)/255.0, alpha: 1.0)

arc4random返回给我们一个任意整数,它类型是UInt32

版本二:

let red = arc4random_uniform(256)
let green = arc4random_uniform(256)
let blue = arc4random_uniform(256)

let color = UIColor(red: CGFloat(red)/255.0, green: CGFloat(green)/255.0, blue: CGFloat(blue)/255.0, alpha: 1.0)

arc4random_uniform需要一个UInt32类型的参数n,返回一个0 到 n - 1之间的一个类型为UInt32的整数。这种写法相对于第一种来说更安全,具体原因,请参考这里

版本三:

extension CountableRange {
    public var randomInt: Int {
        let start = lowerBound as! Int
        let end = (upperBound as! Int) - 1
        let count = UInt32(end - start)
        return Int(arc4random_uniform(count)) + start
    }
}

extension CountableClosedRange {
    public var randomInt: Int {
        let start = lowerBound as! Int
        let end = upperBound as! Int
        let count = UInt32(end - start)
        return Int(arc4random_uniform(count)) + start
    }
}
let red = (0...255).randomInt
let green = (0...255).randomInt
let blue = (0...255).randomInt

let color = UIColor(red: CGFloat(red)/255.0, green: CGFloat(green)/255.0, blue: CGFloat(blue)/255.0, alpha: 1.0)

这里我做了点小封装,因为我们需要取一个范围内的随机数,而Swift中就有表示范围的数据结构:CountableRangeCountableClosedRange。这两个数据结构的类型是structCountableRange表示半开区间(0..<256), CountableClosedRange表示闭合区间(0...255)。这时候我们很容易想到扩展它们,添加一个取随机数的方法,就能实现在这个取在某个特定范围内的随机数了。这种方法相对于上面两个,更自然,更容易理解当然也容易记住。

具体详细的代码,请参考SwiftDevHints

参考

联系方式

备注

我们在软件开发的过程中,为了提高效率,其中很重要的一环就是把反复使用到的功能或模块封装起来。因此我在GitHub上开源了一个小工具集 - SwiftDevHints,来总结自己在实际项目开发过程中封装的一些小功能。

刚刚介绍的只是其中一个小功能,想看看其它更多功能,请直接点击SwiftDevHints。如果您觉得对您有所帮助,请给一个star吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 整型随机数如果我们想要一个整型的随机数,则可以考虑用arc4random系列函数。我们可以通过man arc4ra...
    kobehjk阅读 3,314评论 0 2
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,185评论 6 13
  • 问题 1)柯里化,通过柯里化,改造target-action,因为selector只能使用字符串,在编译时无法发现...
    lanjing阅读 3,548评论 3 19
  • 一 、随机数的介绍 随机数 生成一个随机数是每一个开发人员必备的技能,其中生成随机的的方法也是很多的,例如:arc...
    NetWork小贱阅读 19,296评论 0 20
  • 一个app大多数情况下都会有设置头像的功能,这就涉及到了访问相册问题,下面着重介绍这两个类。 AssetsLib...
    lvzhehappy阅读 2,975评论 0 50