我正在教自己Swift,并且我遇到了一个随机函数。
我想要实现的目标:用户可以指定范围的最小值和最大值。
代码我现在有了按钮,我相信我将文本声明为整数:
@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不是Range的有效整数,我只是想知道我哪里出错了。
提前感谢您的任何帮助。
答案 0 :(得分:2)
问题在于
let minRange:Int? = Int(lowValue.text!)
let maxRange:Int? = Int(highValue.text!)
被定义为选项。
在这里
func randomNumber(range: Range<Int> = minRange...maxRange) -> Int {
您需要minsRange
和maxRange
是非可选的。
因此,您可以使用guard let
语句安全地执行所需的解包
@IBAction func generateNumbers(sender: AnyObject) {
guard let
lowText = lowValue.text,
highText = highValue.text,
minRange = Int(lowText),
maxRange = Int(highText)
else {
print("Couldn't find valid integers inside lowValue and highValue UITextFields. So I'm giving up...")
return
}
func randomNumber(range: Range<Int> = minRange...maxRange) -> Int {
let min = range.startIndex
let max = range.endIndex
return Int(arc4random_uniform(UInt32(max - min))) + min
}
}
当然不要忘记最后调用你的函数randomNumber(1...10)
@IBAction func generateNumbers(sender: AnyObject) {
guard let
lowText = lowValue.text,
highText = highValue.text,
minRange = Int(lowText),
maxRange = Int(highText)
else {
print("Couldn't find valid integers inside lowValue and highValue UITextFields. So I'm giving up...")
return
}
let result = Int(arc4random_uniform(UInt32(minRange - maxRange))) + minRange
}
答案 1 :(得分:1)
正如其他人所认定的那样,您的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
。
此处还有另一个潜在的 gotcha 。如果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)
}