수색…


소개

스위프트 Documentarion에서

클로저는 클로저가 함수의 인수로 전달 될 때 함수를 이스케이프 처리한다고하지만 함수가 반환 된 후에 호출됩니다. 클로저를 매개 변수 중 하나로 사용하는 함수를 선언하면 매개 변수의 형식 앞에 @escaping을 사용하여 클로저가 이스케이프 할 수 있음을 나타낼 수 있습니다.

도주하지 않는 폐쇄

스위프트 1과 2에서 클로저 매개 변수는 기본적으로 이스케이프하고있었습니다. 클로저가 함수 본문을 벗어나지 않는다는 것을 알고 있다면 @noescape 특성으로 매개 변수를 표시 할 수 있습니다.

스위프트 3에서는 다른 방법이 있습니다. 클로저 매개 변수는 기본적으로 이스케이프가 아닙니다. 함수를 이스케이프하려면 @escaping 특성으로 표시해야합니다.

class ClassOne {
  // @noescape is applied here as default
  func methodOne(completion: () -> Void) {
    // 
  }
}

class ClassTwo {
  let obj = ClassOne()
  var greeting = "Hello, World!"

  func methodTwo() {
    obj.methodOne() {
      // self.greeting is required
      print(greeting)
    }
  }
}

폐쇄 도주

스위프트 Documentarion에서

@ 이스케이프

이 속성을 메서드 또는 함수 선언의 매개 변수 유형에 적용하여 매개 변수의 값을 나중에 실행할 수 있도록 저장할 수 있음을 나타냅니다. 이는 값이 통화 수명보다 오래 지속될 수 있음을 의미합니다. 이스케이프 형식 특성이있는 함수 형식 매개 변수에는 자체 명시 적 사용이 필요합니다. 속성 또는 메소드.

class ClassThree {

    var closure: (() -> ())?

    func doSomething(completion: @escaping () -> ()) {
        closure = finishBlock
    }
}

위의 예제에서 완성 블록은 클로저에 저장되고 문자 그대로 함수 호출을 넘어 살게됩니다. 따라서 컴파일러는 완성 블록을 @escaping으로 표시해야합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow