Fermetures, boucles dans Swift et problèmes de champ de texte en alerte
typecho
typecho 2017-06-24 09:44:21
0
2
1083
@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) 

}

Savez-vous ce que [unowned self] fait dans le code ci-dessus ? Je sais que c'est pour empêcher les boucles, mais ce code est un peu difficile à comprendre. Quelles boucles sont empêchées ?

La question la plus importante est la suivante : quelle est l'action derrière [unowned self] ? Cela semble sortir de nulle part. Je ne sais pas ce que cela signifie, mais sans cela, le code signalera une erreur.

guard let textField = alert.textFields?.first,

     let nameToSave = textField.text else {return}  
     

Que signifient les deux codes ci-dessus ? Que signifie « alert.textFields?.first » ? Pourquoi cette alerte peut-elle référencer un champ de texte avant d'ajouter un champ de texte ?

Il y a beaucoup de questions. J'ai le vertige lorsque des fermetures apparaissent dans le code. J'espère que quelqu'un pourra y répondre en détail.

typecho
typecho

Following the voice in heart.

répondre à tous(2)
某草草
  1. Il n'est pas nécessaire d'ajouter [unowned self] au code ci-dessus, car il n'y a pas de référence circulaire à l'intérieur du bloc

  2. Les paramètres du bloc de gestionnaire dans
  3. action是UIAlertAction 便利构造函数public convenience init(title: String?, style: UIAlertActionStyle, handler: ((UIAlertAction) -> Swift.Void)? = nil) Ce qui précède est dû à la méthode d'écriture de fermeture de fin Swift Équivalent à :

  4. .
  5. textFieldsUIAlertController中的可变数组var textFields: [UITextField]?
    guard是对textFields可选属性进行可选绑定, textField est la valeur après le déballage de la valeur facultative et n'est pas nulle. Lorsque la valeur facultative de textFields est nulle, le code suivant ne sera pas exécuté.

        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梦

Les mots-clés unowned et low sont tous deux utilisés pour rompre les cycles de référence. La différence avec low est queowned est généralement utilisé lorsque l'instance référencée peut être garantie d'avoir un cycle de vie plus long. Dans ce cas, ARC ne définira pas automatiquement l'instance sur. nul. Mais je pense qu'il n'est pas nécessaire d'ajouter [onowned self] au code ci-dessus. Je ne vois pas où une référence circulaire se produira ici.

L'action suivie de

[unowned self] indique qu'il s'agit d'un paramètre de la fermeture, car le dernier paramètre du constructeur de UIAlertAction nécessite un paramètre de type UIAlertAction!, comme suit :
convenience init(title title: String!, style style : UIAlertActionStyle, gestionnaire gestionnaire : ((UIAlertAction!) -> Void) !)

 guard let textField = alert.textFields?.first,       
 let nameToSave = textField.text else {return} 

La signification de ce code est que la logique suivante ne sera exécutée que lorsque alert.textFields?.first n'est pas vide, sinon elle sera renvoyée directement. Le deuxième let ne peut être exécuté que lorsque le textField du premier let n'est pas nul. Il s'agit d'une utilisation courante dans Swift. Vous pouvez consulter la documentation pour plus de détails.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal