[Swift]Swift @escaping and Completion Handler
Xin chào, tôi đã hiểu 'Đóng cửa' của Swift chính xác hơn.
Nhưng @escaping
và Completion Handler
quá khó hiểu
Tôi đã tìm kiếm nhiều thông tin đăng và các văn bản chính thức của Swift, nhưng tôi stil cảm thấy không đủ
Đây là đoạn mã nguồn của văn bản 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 @esacping
Đầu tiên toring đóng cửa, thứ hai là Async điều hành mục đích
Và, từ bây giờ họ là những câu hỏi của tôi
Thứ nhất, nếu doSomething
thực hiện sau đó someFunctionWithEscapingClosure
sẽ thực hiện với tham số đóng cửa và đóng cửa đó sẽ được lưu trong mảng biến toàn cầu.
Tôi nghĩ rằng việc đóng cửa là {self.x = 100}
Làm thế nào self
trong {self.x = 100} mà lưu trong biến toàn cầu completionHandlers
có thể kết nối với instance
rằng đối tượng của SomeClass
?
Thứ hai, tôi hiểu được someFunctionWithEscapingClosure
như thế này.
Để lưu trữ biến đóng cục bộ completionHandler
thành biến toàn cục 'completionHandlers`, chúng tôi sử dụng từ khóa @escaping!
mà không @escaping từ khóa someFunctionWithEscapingClosure
lợi nhuận, biến cục bộ completionHandler
sẽ loại bỏ từ bộ nhớ
@escaping được giữ đóng cửa mà trong bộ nhớ
là quyền này?
Cuối cùng, tôi tự hỏi về sự tồn tại của ngữ pháp này.
Có lẽ đây là một câu hỏi rất thô sơ
nếu chúng ta muốn thực hiện một số chức năng sau khi một số chức năng cụ thể
lý do tại sao chúng ta không chỉ cần gọi một số chức năng sau khi gọi hàm cụ thể
là những gì sự khác biệt giữa sử dụng mẫu trên và sử dụng chức năng gọi lại thoát
cảm ơn bạn đã đọc câu hỏi dài và xin lỗi vì tôi không phải là người gốc
liên kết của bạn rất hữu ích –
Cảm ơn, hãy tận hưởng mã hóa trong Swift –