I instrumented your code and there is a design flaw:
var body: some View {
VStack{
Spacer()
HStack{
Spacer()
Text("\(digits)")
.font(.system(size: 50))
.bold()
.padding()
}
Spacer()
LazyVGrid(columns: gridItemLayout, content: {
ForEach(0..5){ i in
ForEach(0..4){ j in
RoundedRectangle(cornerRadius: 35.0)
.foregroundColor(.orange)
.frame(width: 80, height: 80, alignment: .center)
.overlay(
Text("\(numeri[i][j].rawValue)")
.font(.largeTitle)
.foregroundColor(.black)
).onTapGesture {
switch numeri[i][j] {
case Nums.AC:
operat = Nums.AC;
res = 0
case Nums.uguale:
operat = Nums.uguale;
res = final
print("uguale", "final", final, "digits", digits)
case Nums.somma:
operat = Nums.somma;
previousVar = res;
res = 0;
con = 0
print("somma", "previousVar", previousVar, "digits", digits)
case Nums.meno:
operat = Nums.meno;
previousVar = res;
res = 0
con = 0
case Nums.divisione:
operat = Nums.divisione;
previousVar = res;
res = 0;
con = 0
case Nums.moltiplicazione:
operat = Nums.moltiplicazione;
previousVar = res;
res = 0;
con = 0
case Nums.percentuale:
operat = Nums.percentuale;
res = res / 100
case Nums.piùMeno:
operat = Nums.piùMeno;
if digits.hasPrefix("-") {
digits = String(digits.dropFirst())
} else {
digits = "-" + digits
}
con = 0
case Nums.virgola:
operat = Nums.virgola;
print("res", res, "con", con, "digits", digits)
if !digits.contains(".") {
digits += "."
}
default:
if digits == "0" {
digits = numeri[i][j].rawValue
} else {
digits += numeri[i][j].rawValue
}
con += 1
print("default res", res, "con", con, "digits", digits)
}
}
}
}
}).onReceive(timer) { _ in
if con != 0 {
if operat == Nums.divisione{
final = previousVar / res
} else if operat == Nums.meno{
final = previousVar - res
} else if operat == Nums.moltiplicazione{
final = previousVar * res
} else if operat == Nums.somma{
final = previousVar + res
print("final", final, "res", res, "previous", previousVar, "digits", digits)
}
}
I type : 3.8 + 2.1 =
I get:
default res 3.0 con 1 digits 3
res 3.0 con 1 digits 3
default res 3.8 con 2 digits 3.8
somma previousVar 3.8 digits 0
default res 2.0 con 1 digits 2
final 5.8 res 2.0 previous 3.8 digits 2
… this line repeated because of timer
final 5.8 res 2.0 previous 3.8 digits 2
res 2.0 con 1 digits 2
default res 2.1 con 2 digits 2.1
uguale final 5.8 digits 5.8
This shows that the computation:
final = previousVar + res
print("final", final, "res", res, "previous", previousVar, "digits", digits)
is done before the second operand with the decimal is completely read into res: it is read after the computation.
Note: with the names of your var (what is con ?) it is extremely difficult to grasp your code.
Why don't you save the 2 operands and just compute (as you would do with a reverse polish notation) ?