Heim > Fragen und Antworten > Hauptteil
@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()
}
let cancelAction = UIAlertAction(title: "Cancel", style: .default)
alert.addTextField()
alert.addAction(saveAction)
alert.addAction(cancelAction)
present(alert, animated: true)
}
Wissen Sie, was [unowned self] im obigen Code tut? Ich weiß, dass es darum geht, Schleifen zu verhindern, aber dieser Code ist etwas schwer zu verstehen. Was und welche Schleifen werden verhindert?
Die wichtigere Frage ist: Was steckt hinter [unowned self]? Es scheint aus dem Nichts zu kommen. Ich weiß nicht, was es bedeutet, aber ohne es wird der Code einen Fehler melden.
guard let textField = alarm.textFields?.first,
let nameToSave = textField.text else {return}
Was bedeuten die beiden oben genannten Codes? Was bedeutet „alert.textFields?.first“? Warum kann diese Warnung auf ein Textfeld verweisen, bevor ein Textfeld hinzugefügt wird?
Mir wird schwindelig, wenn Abschlüsse im Code auftauchen. Ich hoffe, jemand kann sie ausführlich beantworten.
某草草2017-06-24 09:46:21
上面代码没有必要加上[unowned self], 因为block内部没有循环引用
action
是UIAlertAction 便利构造函数public convenience init(title: String?, style: UIAlertActionStyle, handler: ((UIAlertAction) -> Swift.Void)? = nil)
中handler这个block的参数.上面是因为swift尾随闭包写法.等价于:
textFields
是UIAlertController
中的可变数组var textFields: [UITextField]?
guard是对textFields
可选属性进行可选绑定, textField
是可选值解包非nil后的值,当textFields可选值为nil时, 将不执行后面的代码.
let saveAction = UIAlertAction(title: "", style: .default, handler: { action in
guard let textField = alert.textFields?.first,
let nameToSave = textField.text else {return}
self.names.append(nameToSave)
self.tableView.reloadData()
})
过去多啦不再A梦2017-06-24 09:46:21
unowned关键字和weak都用于打破循环引用,与 weak不同的是通常情况下当能够保证所引用的实例具有更长的生命周期时,使用owned, 此时ARC不会自动将实例置为nil。但是我认为上述代码没有必要加[onowned self],这里我没有看出来哪里会产生循环引用。
[unowned self]后面跟的action表示是闭包的参数,因为UIAlertAction的构造函数的最后一个参数需要一个UIAlertAction!类型的参数,如下:
convenience init(title title: String!, style style: UIAlertActionStyle, handler handler: ((UIAlertAction!) -> Void)!)
guard let textField = alert.textFields?.first,
let nameToSave = textField.text else {return}
这段代码的意思是只有alert.textFields?.first不为空时才会执行后续的逻辑,否则直接返回。其中第二个let只有在第一个let的textField不为nil时才能执行。这是swift中的常见用法,具体的你可以看看文档。