@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)
}
Adakah anda tahu apa yang [unowned self] lakukan dalam kod di atas? Saya tahu ia adalah untuk menghalang gelung, tetapi kod ini agak sukar untuk difahami Apakah dan gelung apa yang dihalang?
Persoalan yang lebih penting ialah, apakah tindakan di sebalik [unowned self]? Nampaknya kelihatan tidak jelas Saya tidak tahu maksudnya, tetapi tanpanya, kod itu akan melaporkan ralat.
jaga biar textField = alert.textFields?.first,
let nameToSave = textField.text else {return}
Apakah maksud kedua-dua kod di atas? Apakah maksud "alert.textFields?.first"? Mengapakah amaran ini boleh merujuk medan teks sebelum menambah medan teks?
Terdapat banyak soalan Saya menjadi pening apabila penutupan muncul dalam kod saya harap seseorang dapat menjawabnya dengan terperinci.
Tidak perlu menambah [unowned self] pada kod di atas, kerana tiada rujukan bulat di dalam blok
action
是UIAlertAction 便利构造函数public convenience init(title: String?, style: UIAlertActionStyle, handler: ((UIAlertAction) -> Swift.Void)? = nil)
di atas adalah kerana kaedah penulisan penutupan Swift Bersamaan dengan:textFields
是UIAlertController
中的可变数组var textFields: [UITextField]?
guard是对
textFields
可选属性进行可选绑定,textField
ialah nilai selepas nilai pilihan dibongkar dan bukan nil Apabila nilai pilihan TextFields adalah nil, kod berikut tidak akan dilaksanakanKata kunci yang tidak dimiliki dan yang lemah kedua-duanya digunakan untuk memecahkan kitaran rujukan. Perbezaan daripada yang lemah ialah yang dimiliki biasanya digunakan apabila contoh yang dirujuk boleh dijamin mempunyai kitaran hayat yang lebih lama tiada. Tetapi saya fikir tidak perlu menambah [diri sendiri] pada kod di atas. Saya tidak nampak di mana rujukan pekeliling akan berlaku di sini.
Tindakan yang diikuti oleh[unowned self] menunjukkan bahawa ia adalah parameter penutupan, kerana parameter terakhir pembina UIAlertAction memerlukan parameter jenis UIAlertAction!, seperti berikut:
convenience init(title title: String!, style gaya: UIAlertActionStyle, pengendali pengendali: ((UIAlertAction!) -> Void)!)
Maksud kod ini ialah logik seterusnya akan dilaksanakan hanya apabila alert.textFields?.first tidak kosong, jika tidak, ia akan dikembalikan terus. Let kedua hanya boleh dilaksanakan apabila textField bagi let pertama bukan nol. Ini adalah penggunaan biasa dalam swift Anda boleh menyemak dokumentasi untuk butiran.