基本运算:加、减、乘、除。
当然可以!我们可以实现一个更复杂的计算器,支持以下功能:
基本运算:加、减、乘、除。
链式调用:支持连续操作。
优先级运算:支持带括号的表达式解析,处理运算符优先级。
错误处理:处理除零错误和无效表达式。
科学计算功能:例如平方根、幂运算等。
下面是一个示例实现:
swift
import Foundation
// 定义计算器错误类型
enum CalculatorError: Error {
case divisionByZero
case invalidExpression
}
// 定义计算器类
class Calculator {
private var currentValue: Double = 0.0
// 加法
@discardableResult
func add(_ value: Double) -> Calculator {
currentValue += value
return self
}
// 减法
@discardableResult
展开全文func subtract(_ value: Double) -> Calculator {
currentValue -= value
return self
}
// 乘法
@discardableResult
func multiply(_ value: Double) -> Calculator {
currentValue *= value
return self
}
// 除法
@discardableResult
func divide(_ value: Double) -> Calculator {
if value == 0 {
print("错误:除数不能为零")
return self
}
currentValue /= value
return self
}
// 平方根
@discardableResult
func squareRoot() -> Calculator {
if currentValue < 0 {
print("错误:无法计算负数的平方根")
return self
}
currentValue = sqrt(currentValue)
return self
}
// 幂运算
@discardableResult
func power(_ exponent: Double) -> Calculator {
currentValue = pow(currentValue, exponent)
return self
}
// 获取当前值
func getValue() -> Double {
return currentValue
}
// 重置计算器
func reset() {
currentValue = 0.0
}
// 解析和计算表达式
func evaluateExpression(_ expression: String) throws -> Double {
// 使用 NSExpression 来解析简单的数学表达式
let nsExpression = NSExpression(format: expression)
guard let result = nsExpression.expressionValue(with: nil, context: nil) as? Double else {
throw CalculatorError.invalidExpression
}
return result
}
}
// 使用计算器
let calculator = Calculator()
// 链式调用示例
let result1 = calculator.add(5).multiply(2).subtract(3).getValue()
print("链式调用结果: \(result1)") // 输出: 链式调用结果: 7.0
// 重置计算器
calculator.reset()
// 表达式解析示例
do {
let result2 = try calculator.evaluateExpression("3 + 5 * 2 - 4 / 2")
print("表达式解析结果: \(result2)") // 输出: 表达式解析结果: 11.0
} catch CalculatorError.divisionByZero {
print("错误:除数不能为零")
} catch CalculatorError.invalidExpression {
print("错误:无效的表达式")
} catch {
print("未知错误: \(error)")
}
// 科学计算功能示例
calculator.reset()
calculator.add(16).squareRoot()
print("平方根结果: \(calculator.getValue())") // 输出: 平方根结果: 4.0
calculator.reset()
calculator.add(2).power(3)
print("幂运算结果: \(calculator.getValue())") // 输出: 幂运算结果: 8.0
// 除零错误示例
calculator.reset()
let _ = calculator.divide(0) // 输出: 错误:除数不能为零
// 无效表达式示例
do {
let _ = try calculator.evaluateExpression("3 + 5 * 2 - 4 /") // 这里会抛出无效表达式错误
} catch {
print("捕获到错误: \(error)") // 输出: 捕获到错误: invalidExpression
}
代码说明
链式调用:
每个运算方法(add、subtract、multiply、divide、squareRoot、power)都返回 self,允许连续调用。
科学计算功能:
squareRoot 方法计算当前值的平方根。
power 方法计算当前值的幂。
表达式解析:
使用 NSExpression 来解析和计算字符串表达式。NSExpression 支持基本的数学运算和括号,能够处理运算符优先级。
错误处理:
使用 CalculatorError 枚举来定义可能的错误类型。
在 divide 方法中,检查除数是否为零,并在这种情况下打印错误消息。
在 squareRoot 方法中,检查当前值是否为负数,并在这种情况下打印错误消息。
在 evaluateExpression 方法中,使用 do-catch 块来捕获和处理解析错误。
重置功能:
reset 方法将计算器的当前值重置为零。
通过这种方式,你可以创建一个功能更强大、更灵活的计算器,支持链式调用、表达式解析、科学计算和错误处理。