我正在尝试修改另一个类中的变量,但它并没有改变。
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。
答案 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
}
}