ฉันพยายามทำความเข้าใจ 'การปิด' ของ 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 เก็บไว้ในความทรงจำ
นี่ใช่มั้ย?
สุดท้ายนี้ฉันแค่สงสัยเกี่ยวกับการมีอยู่ของไวยากรณ์นี้
บางทีนี่อาจเป็นคำถามพื้นฐาน
หากเราต้องการให้บางฟังก์ชันดำเนินการหลังจากฟังก์ชันเฉพาะบางฟังก์ชัน ทำไมเราไม่เรียกใช้ฟังก์ชันบางอย่างหลังจากเรียกฟังก์ชันเฉพาะ
อะไรคือความแตกต่างระหว่างการใช้รูปแบบด้านบนและการใช้ฟังก์ชันการเรียกกลับที่หลีกเลี่ยง
