@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.
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
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 à :textFields
是UIAlertController
中的可变数组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é.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) !)
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.