ios - swift中的闭包,循环,和alert中的textfield问题

查看:115
本文介绍了ios - swift中的闭包,循环,和alert中的textfield问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

@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) 

}

有没有知道上面代码中的[unowned self]是什么作用?我知道是防止循环,但是这段代码有点看不太懂,防止的是什么和什么的循环呢?

更重要的问题是,[unowned self] 后面的action是什么东西呢?好像凭空出现的,不知道是什么意思,但是少了它代码又会报错。

guard let textField = alert.textFields?.first,

     let nameToSave = textField.text else {return}  
     

上面两句代码又分别是什么意思呢?alert.textFields?.first是什么意思?为什么这个alert还没有添加textfield已经能引用textfield呢?

问题有点多,代码中一出现闭包我就晕了,希望有大神可以详细回答一下,拜谢。

解决方案

  1. 上面代码没有必要加上[unowned self], 因为block内部没有循环引用

  2. action是UIAlertAction 便利构造函数public convenience init(title: String?, style: UIAlertActionStyle, handler: ((UIAlertAction) -> Swift.Void)? = nil)中handler这个block的参数.上面是因为swift尾随闭包写法.等价于:

  3. textFieldsUIAlertController中的可变数组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()
    })

这篇关于ios - swift中的闭包,循环,和alert中的textfield问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆