请帮助我理解这些代码行

时间:2017-01-09 03:26:00

标签: ios swift uialertcontroller

@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是什么意思?

1 个答案:

答案 0 :(得分:1)

saveAction最后有一个闭包块,基本上是触发保存动作时会发生的事情。在闭包内部,您需要使用self引用变量。当您使用self时,它会为闭包创建一个强引用。 [unowned self]基本上意味着不要使用闭包创建强引用。

对于下一部分,guard关键字用于确保值不为零。这里,alert.textFields?.first是可选的文本字段。因此,如果您执行alert.textFields!.first!.text!并且textField结果为nil,则您的应用将崩溃。为防止这种情况,请使用guard关键字。如果其中的值变为nil,则控件将进入else块并返回跳过以下所有代码。

如果您想了解有关强弱参考的更多信息,请查看this文章。