我在教自己快速,并陷入随机函数。
我想要实现的是:用户可以指定范围的最小值和最大值。
我现在有按钮的代码,我相信我是将文本声明为整数:

@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不是有效的整数,我只是想知道哪里出错了。
提前感谢您的帮助。

最佳答案

正如其他人所指出的,你的minRangemaxRangeOptionals。它们需要Int,而不是Int?才能形成范围。
另外,您应该避免使用!来展开文本字段,以防它们nil
如果对于minRangemaxRange(例如110)有一些合理的默认值,则可以使用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)
}

注意:编译器不喜欢使用值minRangemaxRange来设置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中声明的,所以您可以使用minRangemaxRange
@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)
}

07-27 18:22