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

正文

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

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

版本一:

1
2
3
4
5
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

版本二:

1
2
3
4
5
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的整数。这种写法相对于第一种来说更安全,具体原因,请参考这里

版本三:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
}
}
1
2
3
4
5
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吧。