我正在创建一个高级计算器应用程序,我要处理数字大于 int 的情况,所以我使用 Int(确切地说:),但 xcode 不断抱怨并且不接受 nil 值
private func handleEquals() {
let decimalResult: Int? = switch currentOperation {
case .plus:
num1 + (num2 ?? num1)
case .minus:
num1 - (num2 ?? num1)
case .multiply:
num1 * (num2 ?? num1)
case .divide:
num1 / (num2 ?? num1)
case .changeSign:
num1 * -1
case .percentage:
num1 / 100
case .power:
Int(exactly: pow(Double(num1), 2))
case .customPower:
Int(exactly: pow(Double(num1), Double(num2 ?? num1)))
case .ePower:
Int(pow(exp(1), Double(num2 ?? num1)))
case .log:
log10(Double(num1))
case .logCustomBase:
log10(Double(num1))
case .none:
Double(num1)
}
num1 = Int(decimalResult)
num2 = nil
currentOperation = nil
}
我尝试首先分配
decimalResult
变量并将其分配给 nil 并使用 hte nil 语句更改它,但它不起作用;然后我尝试将 .power
例如直接设置为 nil
但出现此错误
Cannot convert value of type 'ExpressibleByNilLiteral' to specified type 'Int'
你不能说
num1 = Int(decimalResult)
- decimalResult
是可选的,但 Int(_: Int)
想要一个 Int
,而不是 Int?
。
您需要先打开
decimalResult
。另外,从 Int
创建 Int
没有多大意义。
我建议您在溢出的情况下将函数更改为
throw
。
enum CalculationError: Error {
case overflow
}
private func handleEquals() throws {
let decimalResult: Int? = switch currentOperation {
case .plus:
num1 + (num2 ?? num1)
case .minus:
num1 - (num2 ?? num1)
case .multiply:
num1 * (num2 ?? num1)
case .divide:
num1 / (num2 ?? num1)
case .changeSign:
num1 * -1
case .percentage:
num1 / 100
case .power:
Int(exactly: pow(Double(num1), 2))
case .customPower:
Int(exactly: pow(Double(num1), Double(num2 ?? num1)))
case .ePower:
Int(pow(exp(1), Double(num2 ?? num1)))
case .log:
log10(Double(num1))
case .logCustomBase:
log10(Double(num1))
case .none:
Double(num1)
}
guard let decimalResult else {
throw CalculationError.overflow
}
num1 = decimalResult
num2 = nil
currentOperation = nil
}