![](/img/trans.png)
[英]how to link together masterTableView with detailView in Swift
[英]How to “link” two ranges together in swift
我有一個產生隨機數輸出的函數(見下文)。 我希望它從0-50或150-400中選擇輸出,但不要介於兩者之間。 我自己找不到太多...因此,如果你們中的任何人可以發布資源或答案,那將非常棒! 非常感謝!
這三個問號是我假設某些操作員會去的地方。
func random() -> UInt32 {
var range = UInt32(0)...UInt32(50) ??? UInt32(150)...UInt32(400)
return range.startIndex + arc4random_uniform(range.endIndex - range.startIndex + 1)
}
我嘗試使用+運算符和| 操作員,但沒有運氣。
您不能將范圍的並集傳遞給arc4random_uniform()
。
您可以做的是在一個間隔內創建一個隨機數,然后將不在第一個范圍內的所有數字“調整”到第二個范圍內:
func random() -> UInt32 {
var x = arc4random_uniform(302) // 0 .. 301
if (x > 50) {
// map 51 .. 301 to 150 .. 400:
x += 99
}
return x
}
這可以推廣到多個范圍(現已針對Swift 3更新):
func randomNumber(fromRanges ranges: Range<UInt32>...) -> UInt32 {
let totalLength = ranges.reduce(0) { $0 + ($1.upperBound - $1.lowerBound)}
var rnd = arc4random_uniform(totalLength)
for range in ranges {
if rnd < range.upperBound - range.lowerBound {
return rnd + range.lowerBound
}
rnd -= range.upperBound - range.lowerBound
}
fatalError("this should never be reached")
}
let x = randomNumber(fromRanges: 0 ..< 51, 150 ..< 401)
范圍的替代方法是只使用while循環,以確保獲得所需范圍內的值。
func randomFunc() -> UInt32 {
var rand: UInt32 = 401
while rand < 0 || rand > 400 || (rand > 50 && rand < 150){
rand = arc4random_uniform(400)
}
return rand;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.