Swift의 'Closure'를 좀 더 정확하게 이해하려고 노력하고 있습니다.
그러나 @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
첫 번째는 클로저를 저장하기위한 것이고 두 번째는 비동기 운영을위한 것입니다.
다음은 내 질문입니다 .
첫째로, 만약 doSomething
이 실행 후 someFunctionWithEscapingClosure
고정 파라미터로 실행되며, 그 폐쇄 전역 변수 어레이에 저장한다.
클로저는 {self.x = 100}이라고 생각합니다.
self
전역 변수에 저장된 {self.x = 100}에서 어떻게 그 객체에 completionHandlers
연결할 수 있습니까?instance
SomeClass
둘째, 이렇게 이해 someFunctionWithEscapingClosure
합니다.
completionHandler
전역 변수 'completionHandlers we using
@escaping ' 키워드에 지역 변수 클로저를 저장하려면 !
@escaping
키워드 someFunctionWithEscapingClosure
반환이 없으면 지역 변수 completionHandler
가 메모리에서 제거됩니다.
@escaping
그 폐쇄를 기억에 유지하는 것입니다.
이게 옳은 거니?
마지막으로이 문법의 존재가 궁금합니다.
아마도 이것은 매우 초보적인 질문 일 것입니다.
특정 기능 후에 일부 기능을 실행하려는 경우. 특정 함수 호출 후에 그냥 함수를 호출하지 않는 이유는 무엇입니까?
위의 패턴을 사용하는 것과 이스케이프 콜백 함수를 사용하는 것의 차이점은 무엇입니까?