【问题标题】:Runtime error when taking user input for a range获取用户输入的范围时出现运行时错误
【发布时间】:2016-03-31 14:07:01
【问题描述】:

我正在尝试在 Swift 中创建一些代码,这些代码将从 UITextField 对象获取用户输入,从该输入创建一个从 1 到 X(用户输入的数字)的范围,然后从中选择一个随机数范围。

我打电话给我的用户输入这样的文本

var rangeInput: UInt32 {
    get {
        return ((rangeInputTextField?.text ?? "") as? UInt32)! // ERROR OCCURS HERE
    }
}

并创建我的列表并以这种方式拨打电话。

let viewController =  ViewController()
var x = ViewController().rangeInput
let y = (UInt32?(x))
var number = arc4random_uniform(y!)

//MARK: Class for random number

struct RandomNumber {
    // numberRange to change the value for 1...X(user input)
    //creates the list to be picked from. (pickRandom)
   func numberRange(high:  UInt32) ->Range<UInt32>{

        if let high = UInt32?(0) {
            print("Invalid number")
        } else { 
            let high = UInt32(y!) + 1
        }

        let range = 1...high
        return range

    }

    let pickRandom = number
}

回到我的视图控制器,我在按钮的函数中调用它,就像这样。

 @IBAction func rollButton(sender: UIButton) {

     rolledNumber?.text = "\(RandomNumber().pickRandom)"

     if let resignFirstResponder: Bool = resignFirstResponder() {
         self.rangeInputTextField?.resignFirstResponder()     //Closes keyboard
     }
     resignFirstResponder()
}

override func viewDidLoad() {
    super.viewDidLoad()
}

这让我感到困惑,我的代码编译并运行,当我到达模拟器时,一切似乎都很好,我按下我的文本字段,我的数字键盘拉起,我可以输入我的号码,但是当我按下我设置的滚动按钮,它崩溃了。它给了我一个错误说“线程1:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0x0)” 和 cmd 行中的“致命错误:在展开可选值时意外发现 nil”

在这一行

return ((rangeInputTextField?.text ?? "") as? UInt32)!

【问题讨论】:

  • 你不能将字符串转换为 UInt32,它给你一个 nil 失败,但是你强制解包,当然它会崩溃
  • @Andrea 那么我的整个代码有一个缺陷,因为我一直在使用 UInt32 来选择随机数.. 有没有其他方法可以将用户输入作为 UInt32?
  • 正确的方法是从一个角色创建一个 UInt32。类似 UInt32(string)
  • 你为什么不直接使用一个普通的 int。无论如何,我无法想象使用大于 32 位的数字
  • @pbush25 我试过了,但是使用 arc4random 和 int 给我一个错误,说“无法将类型 'int' 的值转换为预期的参数类型“UInt32”

标签: ios swift uint32


【解决方案1】:

首先,您不能将 String 转换为 UInt32。

其次,听起来你肯定想取回一个数字,所以我不推荐三元运算符后面的空字符串。

试试这个:

return UInt32(rangeInputTextField?.text ?? "0")

您仍然需要将 0 作为字符串传递,因为您不能在两种不同类型(String 和 Int)之间使用三元运算符,但使用它您将始终返回用户使用数字键盘或 0(或您选择默认返回的任何数字)。

【讨论】:

    【解决方案2】:

    我解决了我的问题,实际上我最终废弃了我的整个代码,并创建了一个新结构。

    这对我有用:

    struct RandomNumber {
    func getRandomNumber(x: UInt32) -> String{
        return String(arc4random_uniform(x) + 1)
    }
    

    }

    我所要做的就是从我的视图控制器调用结构

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多