@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 :(得分:1)
saveAction
最后有一个闭包块,基本上是触发保存动作时会发生的事情。在闭包内部,您需要使用self
引用变量。当您使用self
时,它会为闭包创建一个强引用。 [unowned self]
基本上意味着不要使用闭包创建强引用。
对于下一部分,guard
关键字用于确保值不为零。这里,alert.textFields?.first
是可选的文本字段。因此,如果您执行alert.textFields!.first!.text!
并且textField结果为nil,则您的应用将崩溃。为防止这种情况,请使用guard
关键字。如果其中的值变为nil
,则控件将进入else
块并返回跳过以下所有代码。
如果您想了解有关强弱参考的更多信息,请查看this文章。