Tôi đang cố gắng hiểu chính xác hơn "Closure" của Swift.
Nhưng @escaping
và Completion Handler
quá khó hiểu
Tôi đã tìm kiếm nhiều bài đăng và tài liệu chính thức của Swift, nhưng tôi cảm thấy vẫn chưa đủ.
Đây là ví dụ mã của các tài liệu chính thức
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)
Tôi nghe nói rằng có hai cách và lý do sử dụng @escaping
Đầu tiên là để lưu trữ một bao đóng, thứ hai là cho các mục đích hoạt động Async.
Sau đây là những câu hỏi của tôi :
Đầu tiên, nếu doSomething
thực thi thì someFunctionWithEscapingClosure
sẽ thực thi với tham số đóng và đóng đó sẽ được lưu trong mảng biến toàn cục.
Tôi nghĩ rằng đóng cửa là {self.x = 100}
Làm cách nào self
trong {self.x = 100} được lưu trong biến toàn cục completionHandlers
có thể kết nối với instance
đối tượng đó của SomeClass
?
Thứ hai, tôi hiểu someFunctionWithEscapingClosure
như thế này.
Để lưu trữ biến cục bộ, đóng từ khóa completionHandler
biến toàn cục 'completeHandlers we using
@ Escape`!
không có @escaping
từ khóa someFunctionWithEscapingClosure
trả về, biến cục bộ completionHandler
sẽ xóa khỏi bộ nhớ
@escaping
giữ sự khép kín đó trong ký ức
Thê nay đung không?
Cuối cùng, tôi chỉ tự hỏi về sự tồn tại của ngữ pháp này.
Có thể đây là một câu hỏi rất thô sơ.
Nếu chúng ta muốn một số hàm thực thi sau một số hàm cụ thể. Tại sao chúng ta không gọi một số hàm sau một lệnh gọi hàm cụ thể?
Sự khác biệt giữa việc sử dụng mẫu trên và sử dụng hàm gọi lại thoát là gì?