ฉันพยายามทำความเข้าใจ 'การปิด' ของ Swift ให้แม่นยำยิ่งขึ้น
แต่@escaping
และCompletion Handler
ยากเกินกว่าที่จะเข้าใจ
ฉันค้นหาการโพสต์และเอกสารอย่างเป็นทางการของ Swift มากมาย แต่ฉันรู้สึกว่ามันยังไม่เพียงพอ
นี่คือตัวอย่างรหัสของเอกสารราชการ
var completionHandlers: [()->Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping ()->Void){
completionHandlers.append(completionHandler)
}
func someFunctionWithNoneescapingClosure(closure: ()->Void){
closure()
}
class SomeClass{
var x:Int = 10
func doSomething(){
someFunctionWithEscapingClosure {
self.x = 100
//not excute yet
}
someFunctionWithNoneescapingClosure {
x = 200
}
}
}
let instance = SomeClass()
instance.doSomething()
print(instance.x)
completionHandlers.first?()
print(instance.x)
ฉันได้ยินมาว่ามีสองวิธีและเหตุผลที่ใช้ @escaping
อันดับแรกใช้สำหรับการจัดเก็บการปิดตัวที่สองใช้สำหรับวัตถุประสงค์ในการดำเนินงานของ Async
ต่อไปนี้เป็นคำถามของฉัน :
ขั้นแรกหากdoSomething
ดำเนินการsomeFunctionWithEscapingClosure
จะดำเนินการด้วยพารามิเตอร์การปิดและการปิดนั้นจะถูกบันทึกในอาร์เรย์ตัวแปรส่วนกลาง
ฉันคิดว่าการปิดคือ {self.x = 100}
วิธีself
ใน {self.x = 100} ที่บันทึกไว้ในตัวแปรทั่วโลกcompletionHandlers
สามารถเชื่อมต่อกับinstance
วัตถุที่SomeClass
?
ประการที่สองฉันเข้าใจsomeFunctionWithEscapingClosure
เช่นนี้
ในการจัดเก็บการปิดตัวแปรในเครื่องcompletionHandler
ไปยังwe using
คำหลัก'completeHandlers @ escapeing` ของตัวแปรส่วนกลาง!
หากไม่มีการส่งคืน@escaping
คำหลักsomeFunctionWithEscapingClosure
ตัวแปรภายในcompletionHandler
จะลบออกจากหน่วยความจำ
@escaping
เก็บไว้ในความทรงจำ
นี่ใช่มั้ย?
สุดท้ายนี้ฉันแค่สงสัยเกี่ยวกับการมีอยู่ของไวยากรณ์นี้
บางทีนี่อาจเป็นคำถามพื้นฐาน
หากเราต้องการให้บางฟังก์ชันดำเนินการหลังจากฟังก์ชันเฉพาะบางฟังก์ชัน ทำไมเราไม่เรียกใช้ฟังก์ชันบางอย่างหลังจากเรียกฟังก์ชันเฉพาะ
อะไรคือความแตกต่างระหว่างการใช้รูปแบบด้านบนและการใช้ฟังก์ชันการเรียกกลับที่หลีกเลี่ยง