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

variable cannot be modified in another class

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

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

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

}

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

另一个 swift 文件:

class action {

    var k = ViewController().t

        func test()->Int{

            k++

            return k

        }

}

我做错了什么吗? 谢谢。

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

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

您的代码没有按预期工作,因为在 Action class 中您正在创建 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            
    }
}