我开始用Swift学习iOS开发。我正在观看斯坦福大学在iTunes U上的课程,首先是编写计算器。
我使用双打数组作为数字堆栈。当用户单击操作按钮时,它会调用名为operate的方法。为了避免代码重复,我做了一个函数" performOperation"它采用另一个函数(原型:(Double,Double) - > Double)作为参数。
然而,当我运行我的应用程序时,一切正常,直到我尝试执行操作。调试器在performOperation方法中停止,我不知道我的代码有什么问题。我试着将它与老师的那个进行比较,但我没有发现任何差异。
以下是完整的代码:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var display: UILabel!
var userHasStartedToTypeANumber: Bool = false
var operandStack = Array<Double>()
@IBAction func touchDigit(sender: UIButton) {
let digit = sender.currentTitle!
if userHasStartedToTypeANumber {
display.text = display.text! + digit
} else {
display.text = digit
userHasStartedToTypeANumber = true
}
}
@IBAction func enter() {
userHasStartedToTypeANumber = false
operandStack.append(displayValue)
print("operandStack = \(operandStack)")
}
@IBAction func operate(sender: UIButton) {
if userHasStartedToTypeANumber {
enter()
}
switch sender.currentTitle! {
case "+": performOperation { $0 + $1 }
case "−": performOperation { $1 - $0 }
case "X": performOperation { $1 * $0 }
case "÷": performOperation { $0 / $1 }
default: break
}
}
//Here is problematiek method ->
func performOperation(operation: (Double, Double) -> Double) {
if operandStack.count >= 2 {
displayValue = operation(operandStack.removeLast(), operandStack.removeLast())
enter()
}
}
var displayValue: Double {
get {
return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
}
set {
display.text = "\(newValue)"
userHasStartedToTypeANumber = false
}
}
}
PS:我认为这段代码的某些部分非常糟糕,并且计算不应该在这个控制器类中完成,这是一个慎重的选择。我不会在真实的应用程序中这样做。
感谢您的回答。