正文
在實際項目中,我們經(jīng)常遇到一些需要取隨機數(shù)的情況。
比如:我們想要一個隨機顏色,這時候需要三個隨機的,范圍是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返回給我們一個任意整數(shù),它類型是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類型的參數(shù)n,返回一個0 到 n - 1之間的一個類型為UInt32的整數(shù)。這種寫法相對于第一種來說更安全,具體原因,請參考這里
版本三:
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)
這里我做了點小封裝,因為我們需要取一個范圍內(nèi)的隨機數(shù),而Swift中就有表示范圍的數(shù)據(jù)結(jié)構(gòu):CountableRange和CountableClosedRange。這兩個數(shù)據(jù)結(jié)構(gòu)的類型是struct,CountableRange表示半開區(qū)間(0..<256), CountableClosedRange表示閉合區(qū)間(0...255)。這時候我們很容易想到擴展它們,添加一個取隨機數(shù)的方法,就能實現(xiàn)在這個取在某個特定范圍內(nèi)的隨機數(shù)了。這種方法相對于上面兩個,更自然,更容易理解當(dāng)然也容易記住。
具體詳細(xì)的代碼,請參考SwiftDevHints
參考
聯(lián)系方式
備注
我們在軟件開發(fā)的過程中,為了提高效率,其中很重要的一環(huán)就是把反復(fù)使用到的功能或模塊封裝起來。因此我在GitHub上開源了一個小工具集 - SwiftDevHints,來總結(jié)自己在實際項目開發(fā)過程中封裝的一些小功能。
剛剛介紹的只是其中一個小功能,想看看其它更多功能,請直接點擊SwiftDevHints。如果您覺得對您有所幫助,請給一個star吧。