2014-09-10 2 views
1

В Objective-C, это было очень легко и приятно быть в состоянии сделатьSwift геттер переопределения не вычисленный переменной

- (UIButton *)backButton{ 
     if(!_backButton){ 
      _backButton = [UIButton new]; 
     } 
} 

В Swift Однако, когда вы переопределить свойство геттер, это называется вычисляемым переменным и каждый раз, когда вызывается self.backButton, переменная пересчитывается. Этот пример хорошо иллюстрирует это:

private var backButton: UIBarButtonItem { 
    let button = UIButton(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width*0.06, height: self.view.frame.size.width*0.06)) 
    button.setImage(UIImage(named: "back_arrow"), forState: UIControlState.Normal) 
    button.rac_signalForControlEvents(UIControlEvents.TouchUpInside).subscribeNext { 
     (next: AnyObject!) ->() in 
     self.navigationController?.popViewControllerAnimated(true) 
     return() 
    } 
    println("Recalculating the button") 
    let item = UIBarButtonItem(customView: button) 
    return item 
} 

Оператор println вызывается каждый раз, когда я получаю доступ к self.backButton. Кроме того, распечатываемый адрес памяти также изменяется каждый раз. Я понимаю, что это характер вычисленных переменных, поскольку они не хранятся в памяти.

Это аналогичный способ воспроизвести то же поведение, что и в Obj-C в Swift? Все, что я хочу, это способ создать экземпляр некоторой переменной пользовательского интерфейса один раз без необходимости вставлять этот код в метод инициализации.

ответ

4

Лучший способ - создать его как ленивую переменную, таким образом, инициализатор будет вызван один раз, когда он будет доступен.

Используя блок инициализатора, вы можете обеспечить комплексную инициализацию переменной экземпляра.

2

Что вы имеете в виду, называется «ленивым экземпляром». Вы можете воспроизвести его в стрижа, используя ключевое слово lazy:

private lazy var backButton: UIBarButtonItem = { 
     let button = ..... 
     //.... 
     return button 
}() 
+0

Это на самом деле не работает, потому что вам нужно 'UIBarButtonItem = { ', а затем() в нижней части. @ Давид получил это правильно – barndog

+0

Да, конечно. Забыл = и исправил. благодаря – Mario

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