2017-01-09 5 views
0
@IBAction func addName(_ sender: AnyObject) { 
    let alert = UIAlertController(title: "New Name", message: "Add a new name", preferredStyle: .alert) 
    let saveAction = UIAlertAction(title: "Save", style: .default) { 
     [unowned self] action in 
     guard let textField = alert.textFields?.first, 
      let nameToSave = textField.text else { 
       return 
     } 
     self.names.append(nameToSave) 
     self.tableView.reloadData() 
    } 

Я могу понять большинство частей кода, за исключением следующих строк:Пожалуйста, помогите мне понять эти строки кода

[unowned self] action in 
guard let textField = alert.textFields?.first, 

Я хотел бы написать код следующим образом:

@IBAction func addName(_ sender: AnyObject) { 
    let alert = UIAlertController(title: "New Name", message: "Add a new name", preferredStyle: .alert) 
    let saveAction = UIAlertAction(title: "Save", style: .default) { 
    let nameToSave = textField.text 
    self.names.append(nameToSave) 
    self.tableView.reloadData() 
} 

Что случилось с моим кодом?
В чем смысл использования [unowned self] action in и следующего кода guard let?
Какая доза alert.textFields?.first означает?

+0

Вы спрашиваете о двух совершенно отдельных строках кода, а не о одном. Эти два не имеют ничего общего друг с другом. – rmaddy

+0

http://stackoverflow.com/questions/24320347/shall-we-always-use-unowned-self-inside-closure-in-swift ссылаются на этот ответ –

ответ

1

У saveAction есть замыкающий блок в конце, который в основном является тем, что произойдет, когда действие сохранения активировано. Внутри закрытий вам нужно ссылаться на переменные с self. Когда вы используете self, он создает сильную ссылку с закрытием. [unowned self] в основном означает, что он не создает сильную ссылку с закрытием.

Для следующей части ключевое слово guard используется, чтобы гарантировать, что значение не равно нулю. Здесь alert.textFields?.first является необязательным текстовым полем. Итак, если вы делаете alert.textFields!.first!.text!, а textField окажется нулевым, ваше приложение выйдет из строя. Чтобы предотвратить это, используется ключевое слово guard. Если значение в нем окажется nil, элемент управления войдет в блок else и возвращает пропуск всего кода ниже.

Обратите внимание на статью this, если вы хотите узнать больше о сильных и слабых ссылках.