Penutupan, gelung dalam pantas dan isu medan teks dalam amaran
typecho
typecho 2017-06-24 09:44:21
0
2
1068
@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.

typecho
typecho

Following the voice in heart.

membalas semua(2)
某草草
  1. Tidak perlu menambah [unowned self] pada kod di atas, kerana tiada rujukan bulat di dalam blok

  2. Parameter blok pengendali dalam
  3. action是UIAlertAction 便利构造函数public convenience init(title: String?, style: UIAlertActionStyle, handler: ((UIAlertAction) -> Swift.Void)? = nil) di atas adalah kerana kaedah penulisan penutupan Swift Bersamaan dengan:

  4. textFieldsUIAlertController中的可变数组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 dilaksanakan

        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梦

Kata 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)!)

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

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!