不能在另一个 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
}
}
我正在尝试修改另一个 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
}
}