如何在按钮激活后存储变量,用于下一次计算? (在斯威夫特)

时间:2015-03-11 13:22:01

标签: swift uibutton

我有一个简单的应用程序,按下按钮时进行财务计算。我想将该结果存储到变量中,以便下次用户点击计算按钮。与var lastResult = currentResult一样。

然后,用户更改了输入并点击了计算按钮,我希望新currentResult获得与lastResult的差异。很简单,但是......我不知道viewController代码在哪里或如何做到这一点。

如果我可以在计算完成后存储变量,那么可以工作,然后再使用它。但我无法弄清楚这一点。谢谢,迈克。

4 个答案:

答案 0 :(得分:0)

您可以在任何函数之外创建一个全局变量,但在class-body中。像那样:

class YourCalcClass: UIViewController{
    var lastResult:Double?
}

然后在你的方法中你只需设置变量值:

lastResult = currentResult

这样就存储了变量。

答案 1 :(得分:0)

与其他一些面向对象的语言(例如C#)一样,swift不支持类方法中的静态变量(在调用方法之间持续存在的变量。这很可能是由于线程安全问题。

与上面提到的Christian一样,类级变量(在IBAction方法之外声明但在同一类中声明的变量)可以用于此目的。随着程序复杂性的增加(尤其是类实例之间数据值的协调),将这些数据放入单独的模型中通常是有益的。

您可以在Apple网站上阅读有关此结构的更多信息:MVC或模型 - 视图 - 控制器:

https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html

维基百科也有一个很好的页面:

http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

答案 2 :(得分:0)

这里是简单的代码和应用程​​序......

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var yearsEntered: UITextField!
    @IBOutlet weak var resultOut: UILabel!
    @IBOutlet weak var priorOut: UILabel!
    @IBOutlet weak var differenceOut: UILabel!

    @IBAction func calcButton(sender: AnyObject) {

        var age = yearsEntered.text.toInt()

        var result = age! * 7

        resultOut.text = "Age is \(result)"

        var priorResult = result

        var diff = result - priorResult

        priorOut.text = "Prior \(priorResult)"
        differenceOut.text = "Difference \(diff)"

        //where do I save and how to recall the priorResult to use for difference???

    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

答案 3 :(得分:0)

如果您使用的UIViewController实例不超出范围,下面的代码应该适合您。如果这不是您的主视图,我认为每当此视图控制器弹出视图堆栈时您就会遇到问题。在这种情况下,您将需要学习如何使用prepareForSegue函数从调用视图控制器设置视图控制器中的值,并保留数据(先前结果)。这确实是使用委托完成的。

因为程序设计的ios模型是MVC(在我上面的答案中提到),任何类型的持续时间长于类实例的数据都需要由层次结构中的一个类实例拥有(ex 。创建子UIViewController实例的UIViewController实例)或单独的模型。处理这两种情况通常意味着要了解授权情况。这就是数据通常如何传递回层次结构。

这可能是您学习的下一步。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var yearsEntered: UITextField!
    @IBOutlet weak var resultOut: UILabel!
    @IBOutlet weak var priorOut: UILabel!
    @IBOutlet weak var differenceOut: UILabel!

    // variables declared here (not inside methods) last as long as the the view exists (the instance of your view controller class) 
    var priorResult = 0  // you could also use an optional for this

    @IBAction func calcButton(sender: AnyObject) {

        var age = yearsEntered.text.toInt()

        var result = age! * 7

        resultOut.text = "Age is \(result)"

        var diff = result - priorResult

        // This line needs to be below the the above line.  In your example code you were doing this first leading to a diff of zero every time.
        priorResult = result

        priorOut.text = "Prior \(priorResult)"
        differenceOut.text = "Difference \(diff)"
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}