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