用户定义范围的随机数

时间:2016-06-19 13:36:50

标签: swift random range

我正在教自己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的有效整数,我只是想知道我哪里出错了。

提前感谢您的任何帮助。

2 个答案:

答案 0 :(得分:2)

你快到了

问题在于

let minRange:Int? = Int(lowValue.text!)
let maxRange:Int? = Int(highValue.text!)

被定义为选项。

在这里

func randomNumber(range: Range<Int> = minRange...maxRange) -> Int {

您需要minsRangemaxRange是非可选的。

因此,您可以使用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

当然不要忘记最后调用你的函数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)

正如其他人所认定的那样,您的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

此处还有另一个潜在的 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,您可以使用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)
}