Pertanyaan Swift 3: Perbedaan antara DispatchQueue.main.async {} dan DispatcQueue.main.async (execute: {})?


Ada perbedaan semantik yang sangat sempit di antara keduanya, dan saya menemukan diri saya bertanya-tanya mengapa kedua opsi itu ada. Apakah mereka dengan cara yang berbeda secara fungsional, atau mungkin hanya alias dari yang lain?


4
2018-04-11 21:48


asal


Jawaban:


Apa yang Anda maksud disebut sintaksis penutupan belakang. Ini adalah gula sintaksis untuk membuat penutupan lebih mudah digunakan.

Ada banyak jenis fitur gula sintaksis lainnya yang berhubungan dengan penutupan, yang saya bahas dalam jawaban saya sini.

Seperti biasa, saya sangat merekomendasikan Panduan Bahasa Swift, yang melakukan pekerjaan hebat dalam menjelaskan hal-hal mendasar seperti ini.


1
2018-04-11 22:01



Tidak ada perbedaan sama sekali. Mereka, pada kenyataannya, metode yang sama.

Ke compiler,

myQueue.async(execute: { foo() })

persis sama dengan

myQueue.async {
  foo()
}

Ketika argumen terakhir dari fungsi atau metode apa pun adalah fungsi, Anda dapat meneruskan argumen tersebut sebagai penutup trailing alih-alih meneruskannya ke dalam daftar argumen. Ini dilakukan untuk membuat fungsi tingkat tinggi seperti DispatchQueue.async merasa lebih seperti bagian dari bahasa, mengurangi biaya tambahan sintaksis dan memudahkan pembuatan bahasa khusus domain.

Ada dokumentasi tentang sintaks penutupan trailing sini.

Dan omong-omong, cara idiomatis untuk menulis contoh pertama saya adalah:

myQueue.async(execute: foo)

11
2018-04-11 21:52