Tôi đang cố gắng hiểu chính xác hơn "Closure" của Swift.
Nhưng @escapingvà Completion Handlerquá 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 doSomethingthực thi thì someFunctionWithEscapingClosuresẽ 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 selftrong {self.x = 100} được lưu trong biến toàn cục completionHandlerscó thể kết nối với instanceđối tượng đó của SomeClass?
Thứ hai, tôi hiểu someFunctionWithEscapingClosurenhư thế này.
Để lưu trữ biến cục bộ, đóng từ khóa completionHandlerbiến toàn cục 'completeHandlers we using@ Escape`!
không có @escapingtừ khóa someFunctionWithEscapingClosuretrả về, biến cục bộ completionHandlersẽ 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ì?
