正文
在实际项目中,我们经常遇到一些需要取随机数的情况。
比如:我们想要一个随机颜色,这时候需要三个随机的,范围是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中就有表示范围的数据结构:CountableRange
和CountableClosedRange
。这两个数据结构的类型是struct
,CountableRange
表示半开区间(0..<256), CountableClosedRange
表示闭合区间(0...255)。这时候我们很容易想到扩展它们,添加一个取随机数的方法,就能实现在这个取在某个特定范围内的随机数了。这种方法相对于上面两个,更自然,更容易理解当然也容易记住。
具体详细的代码,请参考SwiftDevHints
参考
联系方式
备注
我们在软件开发的过程中,为了提高效率,其中很重要的一环就是把反复使用到的功能或模块封装起来。因此我在GitHub上开源了一个小工具集 - SwiftDevHints,来总结自己在实际项目开发过程中封装的一些小功能。
刚刚介绍的只是其中一个小功能,想看看其它更多功能,请直接点击SwiftDevHints。如果您觉得对您有所帮助,请给一个star吧。