获取范围的用户输入时出现运行时错误
Runtime error when taking user input for a range
我正在尝试在 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()
}
这让我感到困惑,我的代码编译并运行,当我进入模拟器时,一切似乎都很好,我按下我的文本字段,然后我的数字键盘拉起,我可以输入我的号码,但是当我按下我设置的滚动按钮,它崩溃了。它给我一个错误说 "Thread 1: EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP, subcode=0x0)"
和 "fatal error: unexpectedly found nil while unwrapping an Optional value" 在 cmd 行
这一行
return ((rangeInputTextField?.text ?? "") as? UInt32)!
首先,您不能将 String 转换为 UInt32。
其次,听起来你肯定想取回一个数字,所以我不推荐三元运算符后面的空字符串。
试试这个:
return UInt32(rangeInputTextField?.text ?? "0")
您仍然需要将 0 作为字符串传递,因为您不能在两种不同类型(String 和 Int)之间使用三元运算符,但使用它您将始终取回用户输入的数字使用数字键盘或 0(或默认情况下您选择 return 的任何数字)。
我解决了我的问题,实际上我最终废弃了我的整个代码,并创建了一个新结构。
这对我有用:
struct RandomNumber {
func getRandomNumber(x: UInt32) -> String{
return String(arc4random_uniform(x) + 1)
}
}
我所要做的就是从我的视图控制器调用结构
我正在尝试在 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()
}
这让我感到困惑,我的代码编译并运行,当我进入模拟器时,一切似乎都很好,我按下我的文本字段,然后我的数字键盘拉起,我可以输入我的号码,但是当我按下我设置的滚动按钮,它崩溃了。它给我一个错误说 "Thread 1: EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP, subcode=0x0)" 和 "fatal error: unexpectedly found nil while unwrapping an Optional value" 在 cmd 行
这一行
return ((rangeInputTextField?.text ?? "") as? UInt32)!
首先,您不能将 String 转换为 UInt32。
其次,听起来你肯定想取回一个数字,所以我不推荐三元运算符后面的空字符串。
试试这个:
return UInt32(rangeInputTextField?.text ?? "0")
您仍然需要将 0 作为字符串传递,因为您不能在两种不同类型(String 和 Int)之间使用三元运算符,但使用它您将始终取回用户输入的数字使用数字键盘或 0(或默认情况下您选择 return 的任何数字)。
我解决了我的问题,实际上我最终废弃了我的整个代码,并创建了一个新结构。
这对我有用:
struct RandomNumber {
func getRandomNumber(x: UInt32) -> String{
return String(arc4random_uniform(x) + 1)
}
}
我所要做的就是从我的视图控制器调用结构