【问题标题】:Random number with user defined range具有用户定义范围的随机数
【发布时间】:2016-10-20 20:11:15
【问题描述】:

我正在自学 Swift,但我被一个 Random 函数困住了。

我想要实现的目标:用户能够指定范围的最小值和最大值。

我现在有按钮的代码,我相信我将文本声明为整数:

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

提前感谢您的帮助。

【问题讨论】:

标签: swift random range


【解决方案1】:

你快到了

问题是

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

}

【讨论】:

  • 非常感谢,我现在就试试这个! :)
  • 不幸的是,我收到此错误:Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc failed with exit code 1
  • @PeterG:有趣的错误。我认为问题在于randomNumber 中使用的默认参数值。事实上,提供显式值randomNumber(1...100) 似乎可以解决该错误。如果您愿意,我可以为您提供解决方法。
  • 我可以让它在 Playground 中这样工作: let lowValue = "10" let highValue = "50" let minRange:Int? = Int(lowValue) 让 maxRange:Int? = Int(highValue) func randomNumber(range: Range = minRange!...maxRange!) -> Int { let min = range.startIndex let max = range.endIndex return Int(arc4random_uniform(UInt32(max - min) )) + min } 让结果 = randomNumber()
  • @PeterG:它之所以起作用,只是因为您删除了父函数(这似乎是问题所在)。在您的代码中,您使用的是!,我建议您避免使用。只需查看我答案中的更新部分即可。
【解决方案2】:

正如其他人所确定的,您的 minRangemaxRangeOptionals。它们必须是 Int,而不是 Int? 才能形成范围。

此外,您应该避免使用 ! 来展开文本字段,以防万一它们是 nil

如果您对minRangemaxRange 有一些合理的默认值(例如110),您可以使用nil 合并运算符 来解开您的文本字段并替换如果文本字段无法转换为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)
}

【讨论】:

  • 这看起来是一个不错且简单的方法,谢谢。但是,它不断出现错误,要求我插入 ;分隔符,也不起作用。
  • 哪一行特别请求;
  • 实际上只是复制粘贴代码只会导致运行时出错。所以我可能做错了什么。命令 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/u‌​sr/bin/swiftc 失败,退出代码为 1
  • 确保您的所有@IBOutlets 都已连接。
  • 查看我的最新更新。您甚至无需费心创建范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2012-04-13
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
相关资源
最近更新 更多