变量不能在另一个类中修改

时间:2015-02-25 01:39:31

标签: class variables swift

我正在尝试修改另一个类中的变量,但它并没有改变。

class ViewController: UIViewController {
    var t = 1
    override func viewDidLoad() {
        super.viewDidLoad()

        t = 9
        var pp = action().test()
        println(pp) // got “2” here

}

上面应该打印" 10" ,但它显示" 2"。

另一个快速文件:

class action {

    var k = ViewController().t

        func test()->Int{

            k++

            return k

        }

}

我做错了什么? Thnaks。

1 个答案:

答案 0 :(得分:0)

当您拥有一个具有属性的类并创建该类的实例时,属性将绑定到类实例而不是类类型。因此,如果您创建同一类的2个实例,则它们的属性是独立的,因此如果您在一个实例中更改属性,则不会影响另一个实例中的相同属性。

注意:按照惯例,swift类型名称始终以大写字母开头,因此我在代码中将action重命名为Action

您的代码未按预期运行,因为在Action类中您正在创建ViewController的新实例:

var k = ViewController().t

与用于实例化Action的实例无关 - 所以新实例的t属性设置为1。

修复它的正确方法是将视图控制器实例传递给Action,然后让它在该实例上运行。

class ViewController: UIViewController {
    var t = 1
    override func viewDidLoad() {
        super.viewDidLoad()

        t = 9

        var action = Action(viewController: self)
        var pp = action.test()
        println(pp) // got “2” here
    }
}

class Action {
    var k: Int

    init(viewController: ViewController) {
        self.k = viewController.t
    }

    func test()->Int{
        k++
        return k            
    }
}

上面的代码应该说明你的代码有什么问题,但它可以用更好的方式编写。 Action实际上并不需要ViewController实例,只需要将一个整数传递给它的初始化器,因此更好的方法是通过修改代码来实现相同的结果:

class ViewController: UIViewController {
    var t = 1
    override func viewDidLoad() {
        super.viewDidLoad()

        t = 9

        var action = Action(t: self.t)
        var pp = action.test()
        println(pp) // got “2” here
    }
}

class Action {
    var k: Int

    init(t: Int) {
        self.k = t
    }

    func test()->Int{
        k++
        return k            
    }
}