2016-06-20 65 views
0

簡單我是新來的斯威夫特所以這可能變成是非常簡單的,但是我會問你啦,因爲我無法弄清楚意外錯誤:斯威夫特 - 在if語句

我被打在操場上,我想我會寫一些代碼行來做到這一點:在兩個給定值(a,b)之間生成一個隨機數。 例如,如果a = 5且b = 20,則應該生成5和20之間的隨機數。 但我得到一個意外的錯誤!我寫的代碼

這些行
var a = UInt32() 
var b = UInt32() 
var randomNumberInBetween = Int() 

a = 5 
b = 20 

if (b - a) > 0 { 
    randomNumberInBetween = Int(arc4random_uniform(b - a) + a) 
} else { 
    print("error", terminator: "") 
} 

現在:

如果B> A(使(B-A)> 0),它工作得很好。

如果b = a它打印「錯誤」,所以它工作正常。但是如果a> b,使得(b-a)< 0,它給出這個錯誤:「執行被中斷,原因:EXC_BAD_INSTRUCTION(代碼= EXC_l386_INVOP,子代碼= 0x0)」。

screenshot

我的問題是:如果(B-A)< 0不應該只是運行if語句中的 「其他」 部分,只打印 「錯誤」?爲什麼會發生此錯誤?

+3

只需更換'若B - A> 0'通過'如果B> ...了' –

+0

@MartinR ...笑 – Alexander

+0

@MartinR笑奏效,非常感謝很多! – tommsyeah

回答

3

UInt32版本的-有簽名:(UInt32, UInt32) -> UInt32

7-9是-2。

您無法使用無符號類型(例如UInt32)表示-2。

試着這麼做:

func random(inRange range: Range<Int>) -> Int { 
    return range.lowerBound + Int(arc4random_uniform(UInt32(range.upperBound - range.lowerBound))) 
} 

func random(inRange range: ClosedRange<Int>) -> Int { 
    return range.lowerBound + Int(arc4random_uniform(UInt32(range.upperBound - range.lowerBound + 1))) 
} 

print(random(inRange: 1..<10)) 
+2

您的建議功能可能(理論上)也會崩潰,因爲'UInt32(max - min + 1)'可能溢出。所以要麼你必須把它作爲一個先決條件來檢查,要麼使它與「大」整數一起工作,例如。在http://stackoverflow.com/questions/31391577/how-can-i-generate-large-ranged-random-numbers-in-swift。 –

+0

哦,這很好,謝謝 – Alexander

+0

@AMomchilov我想你的意思是'7-9是-2'。 –