Swift 如何避免由于强制展开而导致的致命意外零错误

Swift 如何避免由于强制展开而导致的致命意外零错误,swift,swiftui,Swift,Swiftui,我刚刚开始学习swift的基础知识,当时正在使用swiftui制作一个计算器来掌握它的窍门。但是,我不断得到一个错误,即在尝试强制展开变量时发现一个nil值。我知道使用强制展开不是安全的做法,所以我尝试用if-let语句替换它,但这些语句只会使我的计算结果变为0,即它从未进入if-let语句。我的代码的逻辑如图所示,任何帮助都将不胜感激 import SwiftUI struct ContentView: View { @State private var firstnumber =

我刚刚开始学习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()
    }

}

导入快捷界面
结构ContentView:View{
@国家私有变量firstnumber=0
@国家私有var secondnumber=0
@状态私有变量操作数=“”
@国家私有变量calctext=“0”
@国家私有变量isTyping=false
var body:一些观点{
ZStack{Color.black
.edgesIgnoringSafeArea(.all)
VStack(){
文本字段(“0”,文本:$calctext)
.填充(边线组(顶部:150,前导:20,底部:20,尾随:20))
.边框(颜色.灰色,宽度:2)
.multilitextalignment(.training)
.foregroundColor(颜色.白色)
.font(.largeTitle)
HStack{
创建按钮(“AC”)
.buttonStyle(numberdesign1())
垫片()
createbutton(“+/-”)
.buttonStyle(numberdesign1())
垫片()
createbutton(“%”)
.buttonStyle(numberdesign1())
垫片()
按钮(操作:{
自身操作数单击(÷)
}) {
文本(“÷”)
}
.buttonStyle(ButtonSign())
.转弯半径(15.0)
}.padding()
HStack{
创建按钮(“9”)
.buttonStyle(numberdesign())
垫片()
创建按钮(“8”)
.buttonStyle(numberdesign())
垫片()
创建按钮(“7”)
.buttonStyle(numberdesign())
垫片()
按钮(操作:{
自操作数单击(“×”)
}) {
正文(“×”)
}
.buttonStyle(ButtonSign())
.转弯半径(15.0)
}.padding()
HStack{
创建按钮(“6”)
.buttonStyle(numberdesign())
垫片()
创建按钮(“5”)
.buttonStyle(numberdesign())
垫片()
创建按钮(“4”)
.buttonStyle(numberdesign())
垫片()
按钮(操作:{
self.click(“-”)
}) {
正文(“-”)
}
.buttonStyle(ButtonSign())
.转弯半径(15.0)
}.padding()
HStack{
创建按钮(“3”)
.buttonStyle(numberdesign())
垫片()
创建按钮(“2”)
.buttonStyle(numberdesign())
垫片()
创建按钮(“1”)
.buttonStyle(numberdesign())
垫片()
按钮(操作:{
self.operation单击(“+”)
}) {
文本(“+”)
}
.buttonStyle(ButtonSign())
.转弯半径(15.0)
}.padding()
HStack{
按钮(操作:{
自我数字化(“0”)
}) {
文本(“0”)
}
.foregroundColor(颜色.白色)
.padding(/*@START\u MENU\u TOKEN@*/.all/*@END\u MENU\u TOKEN@*/)
.背景(颜色.灰色)
.边框(颜色.灰色,宽度:1)
.转弯半径(40.0)
垫片()
createbutton(“.”)
.buttonStyle(numberdesign())
垫片()
按钮(操作:{
self.calculate()
}) {
文本(“=”)
}
.buttonStyle(ButtonSign())
.转弯半径(15.0)
}.padding()
}
.aspectRatio(内容模式:.fill)
}
}
private func createbutton(uu编号:String)->按钮{
返回按钮(操作:{
自我数字标签(编号)
}) {
(文本(数字))
}
}
private func digitTapped(uu-number:String)->Void{
如果输入{
calctext+=数字
}否则{
calctext=数字
isTyping=true
}
}
专用函数操作数单击(\操作数:字符串){
isTyping=false
//如果Int(calctext)!=nil{
firstnumber=Int(calctext)!
//        }
self.operand=操作数
calctext=操作数
}
私有函数计算(){
isTyping=false
var结果=0
//如果Int(calctext)!=nil{
secondnumber=Int(计算文本)!
//        }
如果操作数=“+”{
结果=第一个数字+第二个数字
打印(结果、第一个编号、第二个编号)
}如果操作数=“-”则为else{
结果=第一个数字-第二个数字
}如果操作数=“÷”{
结果=第一个数字/第二个数字
}如果操作数=“×”则为else{
结果=第一个数字*第二个数字
}
calctext=“\(结果)”
}
}
结构按钮设计:按钮样式{
func makeBody(配置:配置)->一些视图{
配置标签
.foregroundColor(颜色.白色)
.padding()
.背景(线性)渐变:渐变(颜色:[颜色(“Dar”)
let firstNumber = Int(calcText) ?? 0