- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试完成 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
并通过递归调用计算操作数。然后,该调用通过返回 5
和 4
的两个递归调用计算 +
。
调用树看起来像这样:
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/
我想使用“SpeechSynthesizer”来朗读文本,但该文本包含一些 XML 标记。使用旧的 COM 对象,我使用了 S5Voice.Speak uString, SVSFDefault Or
我对 MIT OCW Python 第 3 课有疑问。 根据简单的数学计算,她使用的代码应该不会成功。 ## EXAMPLE: approximate cube root ##############
从 CSP193p 2015 第 15 讲开始,prepareForSegue 中的以下代码将弹出窗口的高度最小化为 iPad 上的两行标签和文本字段: let minimumSize =
我目前正在尝试完成 iTunes U 上的 Swift 类(class),我们正在构建一个计算器。我无法理解部分代码。 我在下面添加了我认为与文件相关的代码。 让我感到困惑的是:为什么 operati
无法理解 PHRASES 部分的代码。这是《Python 艰难之路》中的代码。那部分之后我很失落。有人可以解释一下吗? 书中没有对下面的代码进行任何解释。 import random from url
此问题来自 MIT Python 类(class) 6.00.1X,Lectrue 8。我尝试了两段略有不同的代码。两者都是为了计算每个学生的平均成绩。 第一个代码没有考虑到可能存在字母等级,第二个代
在第 6 讲 Stanford iOS9 2016 系列讲座中,程序中添加了一个名为 VCL.swift 的文件来演示 View Controller 生命周期。 我已经添加了文件,但是对于行 "pr
我是一名优秀的程序员,十分优秀!