2016-09-21 2 views
6
let loginRegisterButton:UIButton = { 
    let button = UIButton(type: .system) 
    button.backgroundColor = .white 
    button.setTitle("Register", for: .normal) 
    button.translatesAutoresizingMaskIntoConstraints = false 
    button.setTitleColor(.white, for: .normal) 
    return button 
}() 

Эта переменная или функция, почему она возвращает значение? почему мы это называем? он не работает без parenthesis, почему?Как работает блок с фигурными скобками и круглыми скобками?

ответ

7

Это замыкающее устройство создано и используется в том же месте. Вы используете его для инициализации, когда вы не можете поместить все в одно выражение. Эта функция полезна при создании полей только для чтения (let, а не var).

В приведенном выше примере код создает кнопку, а затем выполняет дополнительную настройку перед возвратом результата. Это хороший способ переместить код с init в блоки кода рядом с местом инициализации.

Один из способов визуализировать то, что происходит, чтобы думать о именованной функции, которая делает то же самое:

func makeWhiteButton() -> UIButton { 
    let button = UIButton(type: .system) 
    button.backgroundColor = UIColor.White 
    button.setTitle("Register", for: .normal) 
    button.translatesAutoresizingMaskIntoConstraints = false 
    button.setTitleColor(.white, for: .normal) 
    return button 
} 

Теперь вы можете использовать его в инициализаторе

let loginRegisterButton:UIButton = makeWhiteButton() 

код от вашего post делает то же самое с анонимной функцией «закрытия». Скобки после блокировки замыкаются по той же причине, что и скобки после makeWhiteButton выше.

+0

спасибо, что имеет смысл – Ninja13

+0

@ Ninja13 Добро пожаловать! Если вам не нужна дополнительная помощь, подумайте о том, чтобы принять ответ, нажав на серый флажок рядом с ним. Это позволит другим узнать, что ваша проблема решена, и вы получите новый значок в Stack Overflow. – dasblinkenlight