2015-02-25 3 views
-1

пытаюсь изменить переменную в другом классе, но она не изменяется.переменная не может быть изменена в другом классе

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

Когда у вас есть класс со свойствами и создайте экземпляр этого класса, свойства привязаны к экземпляру класса, а не типу класса. Поэтому, если вы создаете 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    
    } 
} 
+0

Он отлично работает, и это было соответствует моей потребности. @Antonio Спасибо. – jdleung

Смежные вопросы