如何检查零值?即使考虑了 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 letguard 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 值,应用程序也会崩溃。斯威夫特 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

go语言之nil

在MATLAB的直方图中可视化零值和小值

Lua 函数如何返回 nil,即使函数内部的返回值不是 nil?

NULLnilNilNSNull的区别

Go语言 nil:空值/零值

即使我给 url 变量一个值,我也得到一个 nil 值,所以我想知道我做错了啥?