2016-06-20 18 views
0

場合に予期しないエラー:私は遊んでいたスウィフト - 私は、これは非常に単純であることが判明するかもしれませんが、私はそれを把握することはできませんので、私はとにかくあなたを頼むよスウィフトに新たなんだ、簡単な文で

を私はこれを行うためにいくつかのコード行を書くと思った:2つの与えられた値(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場合>()(B-Aとなるよう> 0)それだけで正常に動作します。

b = aの場合、「エラー」が出力されるため正しく動作します。

しかし、a> bの場合、(b-a)<が0であるため、「実行が中断されました。理由:EXC_BAD_INSTRUCTION(コード= EXC_l386_INVOP、サブコード= 0x0)」。

screenshot

私の質問は:もし(B-A)< 0は、それだけでif文の "他" の部分を実行して、単に "エラー" を印刷するべきではないのですか?このエラーはなぜ発生しますか?

+3

をもしB - > 0 '> A' ... –

+0

@MartinR ...笑 – Alexander

+0

@MartinRそれが働い笑、Bかのおかげで'によってロット!! – 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'を意味すると思います。 –

関連する問題

 関連する問題