使用 Switch 语句分配 Nil 变量时无法分配它

问题描述 投票:0回答:1

我正在创建一个高级计算器应用程序,我要处理数字大于 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'
ios swift swiftui
1个回答
0
投票

你不能说

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
}
© www.soinside.com 2019 - 2024. All rights reserved.