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

参考

  • 随机数生成 - 喵神 Swifter Tips

联系方式

  • 微博
  • Twitter
  • GitHub
  • 博客

备注

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

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

你可能感兴趣的:(Swift开发小技巧系列 - 随机数生成)