我在教自己快速,并陷入随机函数。
我想要实现的是:用户可以指定范围的最小值和最大值。
我现在有按钮的代码,我相信我是将文本声明为整数:
@IBAction func generateNumbers(sender: AnyObject) {
let minRange:Int? = Int(lowValue.text!)
let maxRange:Int? = Int(highValue.text!)
func randomNumber(range: Range<Int> = minRange...maxRange) -> Int {
let min = range.startIndex
let max = range.endIndex
return Int(arc4random_uniform(UInt32(max - min))) + min
}
}
显然minRange和maxRange不是有效的整数,我只是想知道哪里出错了。
提前感谢您的帮助。
最佳答案
正如其他人所指出的,你的minRange
和maxRange
是Optionals。它们需要Int
,而不是Int?
才能形成范围。
另外,您应该避免使用!
来展开文本字段,以防它们nil
。
如果对于minRange
和maxRange
(例如1
和10
)有一些合理的默认值,则可以使用nil coalescing运算符来展开文本字段,如果文本字段无法转换为Int
,则将这些值替换为默认值:
@IBAction func generateNumbers(sender: AnyObject) {
let minRange = Int(lowValue.text ?? "") ?? 1
let maxRange = Int(highValue.text ?? "") ?? 10
func randomNumber(range: Range<Int>) -> Int {
let min = range.startIndex
let max = range.endIndex
return Int(arc4random_uniform(UInt32(max - min))) + min
}
// test
let results = randomNumber(minRange...maxRange)
self.field1.text = String(results)
}
注意:编译器不喜欢使用值
minRange
和maxRange
来设置range
的默认值,所以我将它们添加到了randomNumber
的调用中。这里还有另一个潜在的问题。如果
minRange
大于maxRange
,则无法形成范围,因此也应检查:var minRange = Int(lowValue.text ?? "") ?? 1
var maxRange = Int(highValue.text ?? "") ?? 10
if minRange > maxRange {
// Swap 'em
(minRange, maxRange) = (maxRange, minRange)
}
为什么还要折磨自己去创造靶场呢?因为
randomNumber
是在generateNumbers
中声明的,所以您可以使用minRange
和maxRange
:@IBAction func generateNumbers(sender: AnyObject) {
var minRange = Int(lowValue.text ?? "") ?? 1
var maxRange = Int(highValue.text ?? "") ?? 10
if minRange > maxRange {
// Swap 'em
(minRange, maxRange) = (maxRange, minRange)
}
func randomNumber() -> Int {
return Int(arc4random_uniform(UInt32(maxRange - minRange))) + minRange
}
//test
let results = randomNumber()
self.field1.text = String(results)
}