Когда у вас есть класс со свойствами и создайте экземпляр этого класса, свойства привязаны к экземпляру класса, а не типу класса. Поэтому, если вы создаете 2 экземпляра одного класса, их свойства независимы, поэтому, если вы измените свойство в одном экземпляре, это не повлияет на одно и то же свойство в другом экземпляре.
Примечание: по соглашению, в именах стремительного типа всегда начинается в верхнем регистре, поэтому я переименовал 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
}
}
Он отлично работает, и это было соответствует моей потребности. @Antonio Спасибо. – jdleung