gpt4 book ai didi

Swift 中的 iOS 9 斯坦福类(class) - 第 1 讲

转载 作者:行者123 更新时间:2023-11-29 01:46:42 27 4
gpt4 key购买 nike

我目前正在尝试完成 iTunes U 上的 Swift 类(class),我们正在构建一个计算器。我无法理解部分代码。

我在下面添加了我认为与文件相关的代码。

让我感到困惑的是:为什么 operation(operand) 会计算 UnaryOperation 的值(即平方根)?我看到当 CalculatorBrain 类被调用时字典被初始化,但是当我打印字典时我只得到看起来像这样的东西: ].那么,当我单击平方根按钮时,程序会在何处/何时计算平方根?

Class CalculatorBrain
{
private enum Op: Printable
{
case Operand(Double)
case UnaryOperation(String, Double -> Double)
case BinaryOperation(String, (Double, Double) -> Double)

var description: String {
get {
switch self {
case .Operand(let operand):
return "\(operand)"
case .UnaryOperation(let symbol, _):
return symbol
case .BinaryOperation(let symbol, _):
return symbol
}
}
}
}

private var opStack = [Op]()

private var knownOps = [String: Op]()

init() {
func learnOp(op: Op) {
knownOps[op.description] = op

}
learnOp(Op.BinaryOperation("✕", *))
learnOp(Op.BinaryOperation("⌹") { $1 / $0 })
learnOp(Op.BinaryOperation("+", +))
learnOp(Op.BinaryOperation("-") { $0 - $1 })
learnOp(Op.UnaryOperation ("√", sqrt))

}

private func evaluate(ops: [Op]) -> (result: Double?, remainingOps: [Op])
{
if !ops.isEmpty {
var remainingOps = ops
let op = remainingOps.removeLast()
switch op {
case .Operand(let operand):
return (operand, remainingOps)
case .UnaryOperation(_, let operation):
let operandEvaluation = evaluate(remainingOps)
if let operand = operandEvaluation.result {
**return (operation(operand), operandEvaluation.remainingOps)**
}
// case.BinaryOperation(.....)
}
}
return (nil, ops)
}

func evaluate() -> Double? {
let (result, remainder) = evaluate(opStack)
return result
}

func pushOperand(operand: Double) -> Double? {
opStack.append(Op.Operand(operand))
return evaluate()
}

func performOperation(symbol: String) -> Double? {
if let operation = knownOps[symbol] {
opStack.append(operation)
}
return evaluate()
}

最佳答案

Op 枚举实现了Printable 协议(protocol),这意味着它有一个description: String 属性。当您打印 Dictionary 时,您正在将 [String : Op] 发送到 println 函数,该函数然后尝试打印 Op 使用其描述

运算符的描述与 Dictionary 中的键相同的原因是因为 learnOp(op: Op) 函数将键设置为 op.description(knownOps[op.description] = op)

要查看其效果,您可以添加一个新的运算符 learnOp(Op.UnaryOperation ("@", sqrt)),它将打印为 @:@knownOps 字典中。 (并且如果您为 @ 运算符添加一个新按钮,它也会执行平方根运算)


由于计算器是基于堆栈的,因此操作数被插入,然后是操作。当 evaluate() 被调用时,它调用 evaluate(opStack) 传递整个堆栈。

evaluate(ops: [Op]) 然后从堆栈中取出 to 项并在计算完操作数后 计算函数。

例如,假设您要计算 sqrt(4 + 5)。

你会将项目压入堆栈,它看起来像:[ 4, 5, +, sqrt ]

然后 evaluate(ops: [Op]) 查看 sqrt 并通过递归调用计算操作数。然后,该调用通过返回 54 的两个递归调用计算 +

调用树看起来像这样:

ops: [4, 5, +, sqrt]    // Returns sqrt(9) = 3
|
ops: [4, 5, +] // Returns 4 + 5 = 9
____|_____
| |
ops: [4, 5] ops: [4]
return 5 return 4

我强烈建议您在 evaluate() -> Double? 函数上放置一个断点,然后单步执行程序以查看不同操作数和操作的执行情况。

关于Swift 中的 iOS 9 斯坦福类(class) - 第 1 讲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31837677/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com