如何检查零值?即使考虑了 nil 值,应用程序也会崩溃。斯威夫特 [重复]
Posted
技术标签:
【中文标题】如何检查零值?即使考虑了 nil 值,应用程序也会崩溃。斯威夫特 [重复]【英文标题】:How to check for nil value? App crashes even though nil values are accounted for. Swift [duplicate] 【发布时间】:2017-07-05 12:33:59 【问题描述】:我正在 Xcode 上创建一个简单的猜谜游戏,用户必须正确猜出数字(0 到 5 之间)。我以为我已经检查了我的 textFieldInt
的 nil 值,以确保如果没有提交值,应用程序不会崩溃。不幸的是,情况似乎并非如此,我不确定我的错在哪里。
如果我没有输入值并按下按钮,我会收到以下错误消息:
致命错误:在展开可选值时意外发现 nil
我之前遇到过这个问题,并通过正确检查 nil 的正确选项来解决它。尽管现在它似乎仍然“意外发现 nil”,尽管已经考虑了 nil 值。
@IBOutlet var textField: UITextField!
@IBOutlet var label: UILabel!
@IBAction func buttonTapped(_ sender: Any)
let textFieldInt: UInt32 = UInt32(textField.text!)!
let number = arc4random_uniform(6)
if textFieldInt != nil
if textFieldInt != number
label.text = "Wrong! It was \(number)"
else if textFieldInt == number
label.text = "You're right!"
else
label.text = "Please enter a number!"
【问题讨论】:
您的textFieldInt
不是可选的,if textFieldInt != nil
应该显示编译器警告“将 'UInt32' 类型的非可选值与 nil 进行比较总是返回 true” - 所以你有两个强制展开哪个不检查 nil。
【参考方案1】:
我相信错误发生在
let textFieldInt: UInt32 = UInt32(textField.text!)!
如果textField
为空,则textField.text
将为nil,textField.text!
将导致崩溃。
你可以用like
@IBAction func buttonTapped(_ sender: Any)
if textField.text != nil
let textFieldInt: UInt32 = UInt32(textField.text!)!
let number = arc4random_uniform(6)
if textFieldInt != nil
if textFieldInt != number
label.text = "Wrong! It was \(number)"
else if textFieldInt == number
label.text = "You're right!"
else
label.text = "Please enter a number!"
else
label.text = "Please enter a number!"
【讨论】:
【参考方案2】:使用if let
或guard let
来测试您的价值观。例如
if let textFieldInt = UInt32(textField.text!)
//textField.text! can be converted to UInt32
if textFieldInt != number
label.text = "Wrong! It was \(number)"
else if textFieldInt == number
label.text = "You're right!"
else
//textField.text! can NOT be converted to UInt32
label.text = "Please enter a number!"
或者
guard let textFieldInt = UInt32(textField.text!) else
//textField.text! can NOT be converted to UInt32
label.text = "Please enter a number!"
return
//textField.text! can be converted to UInt32
if textFieldInt != number
label.text = "Wrong! It was \(number)"
else if textFieldInt == number
label.text = "You're right!"
【讨论】:
以上是关于如何检查零值?即使考虑了 nil 值,应用程序也会崩溃。斯威夫特 [重复]的主要内容,如果未能解决你的问题,请参考以下文章