如何解决由于强制展开导致的致命意外零错误[重复]

Posted

技术标签:

【中文标题】如何解决由于强制展开导致的致命意外零错误[重复]【英文标题】:How to get around fatal unexpected nil error caused due to forced unwrapping [duplicate] 【发布时间】:2020-07-21 22:41:58 【问题描述】:

我刚刚开始学习 swift 的基础知识,并且正在使用 swiftui 制作一个计算器来掌握它的窍门。但是,在尝试强制解包变量时,我不断收到错误消息,即发现 nil 值。我知道使用强制展开不是安全的做法,所以我尝试用 if let 语句替换它,但那些只会让我的计算结果变为 0,即它永远不会进入 if let 语句。我的代码逻辑在图片中,任何帮助将不胜感激。

import SwiftUI

struct ContentView: View 
    @State private var firstnumber = 0
    @State private var secondnumber = 0
    @State private var operand = ""
    @State private var calctext = "0"
    @State private var isTyping = false

    var body: some View 
        ZStack  Color.black
            .edgesIgnoringSafeArea(.all)
            VStack()
            TextField("0", text: $calctext)
                .padding(EdgeInsets(top: 150, leading: 20, bottom: 20, trailing: 20))
                .border(Color.gray, width: 2)
                .multilineTextAlignment(.trailing)
                .foregroundColor(Color.white)
                .font(.largeTitle)



            HStack
                createbutton("AC")
                .buttonStyle(numberdesign1())
                Spacer()
                createbutton("+/-")
                .buttonStyle(numberdesign1())
                Spacer()
                createbutton(" % ")
                .buttonStyle(numberdesign1())
                Spacer()
                Button(action: 
                    self.operandclick("÷")
                ) 
                Text(" ÷ ")
                
                .buttonStyle(buttondesign())
                .cornerRadius(15.0)
            .padding()

            HStack
                createbutton(" 9 ")
                .buttonStyle(numberdesign())
                Spacer()
                createbutton(" 8 ")
                .buttonStyle(numberdesign())
                Spacer()
                createbutton(" 7 ")
                .buttonStyle(numberdesign())
                Spacer()
                Button(action: 
                    self.operandclick("×")
                ) 
                Text(" × ")
                
                .buttonStyle(buttondesign())
                .cornerRadius(15.0)
            .padding()

            HStack
                createbutton(" 6 ")
                .buttonStyle(numberdesign())
                Spacer()
                createbutton(" 5 ")
                .buttonStyle(numberdesign())
                Spacer()
                createbutton(" 4 ")
                .buttonStyle(numberdesign())
                Spacer()
                Button(action: 
                    self.operandclick("-")
                ) 
                Text(" - ")
                
                .buttonStyle(buttondesign())
                .cornerRadius(15.0)
            .padding()

            HStack
                createbutton(" 3 ")
                .buttonStyle(numberdesign())
                Spacer()
                createbutton(" 2 ")
                .buttonStyle(numberdesign())
                Spacer()
                createbutton(" 1 ")
                .buttonStyle(numberdesign())
                Spacer()
                Button(action: 
                    self.operandclick("+")
                ) 
                Text(" + ")
                
                .buttonStyle(buttondesign())
                .cornerRadius(15.0)

            .padding()

            HStack
                Button(action: 
                    self.digitTapped("0")

                ) 
                    Text(" 0                           ")
                
                .foregroundColor(Color.white)
                .padding(/*@START_MENU_TOKEN@*/.all/*@END_MENU_TOKEN@*/)
                .background(Color.gray)
                .border(Color.gray, width: 1)
                .cornerRadius(40.0)
                Spacer()
                createbutton("  .  ")
                .buttonStyle(numberdesign())
                Spacer()
                Button(action: 
                    self.calculate()
                ) 
                Text(" = ")
                
                .buttonStyle(buttondesign())
                .cornerRadius(15.0)

            .padding()



            
            .aspectRatio(contentMode: .fill)

        
    

    private func createbutton(_ number: String) -> Button<Text> 
        return Button(action: 
            self.digitTapped(number)
        ) 
            (Text(number))
        
    

    private func digitTapped(_ number: String) -> Void 
        if isTyping 
            calctext += number
         else 
            calctext = number
            isTyping = true
        
    

    private func operandclick(_ operand: String) 
        isTyping = false
//        if Int(calctext) != nil 
        firstnumber = Int(calctext)!
//        
        
        self.operand = operand
        calctext = operand
    

    private func calculate() 
        isTyping = false
        var result = 0
//        if Int(calctext) != nil 
        secondnumber = Int(calctext)!
//        
        

        if operand == "+" 
            result = firstnumber + secondnumber
            print (result, firstnumber, secondnumber)
         else if operand == "-" 
            result = firstnumber - secondnumber
         else if operand == "÷" 
            result = firstnumber / secondnumber
         else if operand == "×" 
            result = firstnumber * secondnumber
        

        calctext = "\(result)"
    





struct buttondesign: ButtonStyle 
    func makeBody(configuration: Configuration) -> some View 
        configuration.label
            .foregroundColor(Color.white)
            .padding()
            .background(LinearGradient(gradient: Gradient(colors: [Color("DarkGreen"),Color("LightGreen")]), startPoint: .leading, endPoint: .trailing))
        .clipShape(Circle())
    


struct numberdesign: ButtonStyle 
    func makeBody(configuration: Configuration) -> some View 
        configuration.label
        .foregroundColor(Color.white)
            .padding(.all)
        .background(Color.gray)
        .border(Color.gray, width: 1)
            .clipShape(Circle().scale(1))

    


struct numberdesign1: ButtonStyle 
    func makeBody(configuration: Configuration) -> some View 
        configuration.label
        .foregroundColor(Color.black)
        .padding(.all)
        .background(Color("LightGray"))
        .border(Color.gray, width: 1)
        .clipShape(Circle())

    



struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    


【问题讨论】:

崩溃时calctext 中的内容是什么? 您应该发布代码本身而不是代码图片。这允许人们通过将代码粘贴到项目或 Playground 中来试用您的代码,并允许代码显示在 *** 上的搜索中。 顺便说一句:运算符是执行操作的“函数”,而操作数是该函数的输入。在表达式 3 + 4 = 7 中,运算符是 '+' - 因为它告诉我们如何执行操作 - 操作数是 3 和 4 - 操作所依据的输入。 嗨,calctext 在崩溃时包含 nil,原因我无法理解。我尝试在原始帖子上发布我的代码,但它一直给我格式错误。我现在将使用代码本身更新我的帖子,并感谢您的提示!我没有注意到我命名了错误的操作数。 不能为nil,它是一个String。当它崩溃时,在调试器中打印 calctext 的值。 【参考方案1】:

确保您的 String 没有空间,因为它无法将其转换为整数并且将返回 nil,如果您强制 Cast 它将 crash

【讨论】:

【参考方案2】:

除非你确定它们不包含任何 nil 值,否则你不应该强制解包选项。

我建议您使用nil coalescing 运算符为字符串的整数转换提供默认值

let firstNumber = Int(calcText) ?? 0

【讨论】:

以上是关于如何解决由于强制展开导致的致命意外零错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

swift:致命错误:在展开可选值(lldb)时意外发现 nil,线程 1

如何调试“致命错误:在展开可选值时意外发现 nil”

Swift 错误 - 致命错误:在展开可选值时意外发现 nil [重复]

无法过去 - 线程 1:致命错误:在展开可选值时意外发现 nil [重复]

Swift Xcode 致命错误:在隐式展开可选值时意外发现 nil [重复]

致命错误:在快速 Json 解析中展开可选值时意外发现 nil