在Swift中这个闭包出了什么问题?

时间:2015-11-12 01:06:15

标签: ios swift closures

我开始用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:我认为这段代码的某些部分非常糟糕,并且计算不应该在这个控制器类中完成,这是一个慎重的选择。我不会在真实的应用程序中这样做。

感谢您的回答。

0 个答案:

没有答案