ในภาษาโปรแกรม Swift อาจจะเคยเห็น @escaping
กันบ้าง สำหรับคนที่เพิ่งเคยเห็น ในทีนี้ พลจะมาเล่าให้เห็นภาพว่า ทำไมเราจึงเห็นคนอื่นใช้ keyword นี้ ใช้ตอนไหน เมื่อไหร่เราควรใช้กัน
เอ้า พร้อมแล้วไปกันเลย
มักใช้กับ closure
การประกาศใช้ closure หรือในอีกทางคือการกำหนด type ของ parameter เป็นรูปแบบของ function ที่เราต้องการ เช่น
func goGo(_ doSomethingInFunction: () -> Void) {
doSomethingInFunction()
}
ซึ่งการทำงานแบบนี้ ตัว closure (ในที่นี้ชื่อ doSomethingInFunction
) จะมี scope การทำงานอยู่ในส่วนของ function ที่ชื่อ goGo()
เท่านั้น
แต่การนำมาใช้งานนั้นหากเราเขียนให้ closure ทำงานนอกเหนือจาก scope ของตัว function ที่ประกาศ closure แบบด้านล่าง
func goGo(_ doSomethingInFunction: () -> Void) {
DispatchQueue.main.async {
doSomethingInFunction()
}
}
ก็จะเกิด compiler error ทันที!
เพราะโดยปกติแล้ว การทำงานของ closure จะส้ินสุดไปตามตัว function
ถ้า function จบการทำงาน การทำงานของ closure ก็จะสิ้นสุดลงที่เดียวกัน
ดังนั้นการที่เราต้องการให้ closure เรียกใช้ใน scope การทำงานที่เป็นแบบพวก asynchronous เราจำเป็นต้องระบุตัว closure ให้ตัวระบบรู้ว่า
closure นี้จะหลบหนีจากการสิ้นสุดของ function ได้ ได้ ได้ (@escaping)
แบบด้านล่างนี้ไง ไม่ error
func goGo(_ doSomethingInFunction: @escaping () -> Void) {
DispatchQueue.main.async {
doSomethingInFunction()
}
}
นั่นแหละครับ สงสัยส่วนไหนเพิ่มเติมถามได้