Capture List

1 답변 글타래를 보이고 있습니다
  • 글쓴이
    • Jason
      참가자
      • 글작성 : 1
      • 답글작성 : 1

      야곰이 던져준 숙제에 대한 답변…


      @yagom
      ! 2월 1주차에 해주셨던 클로저 수업 때 마지막에 클로저 캡쳐에 대해 아래 코드들을
      보여주시면서 왜 에러가 나는지(아래 1번의 경우) 알아보라고 하셨잖아요.
      그에 해답을 찾은 거 같아서 글 남깁니다..
      아래 1번의 경우, 클로저가 캡처할 대상을 클로저를 호출하는 시점에 결정하기 때문에 에러가 나는 것 맞나요?
      2번의 경우, 캡처 리스트를 사용하면 클로저가 캡처할 대상을 클로저를 생성하는 시점에 결정하기 때문에 정상작동
      하는 거고요.

      클로저 캡쳐 시점이 default capture semantic 일때랑 capture list 일때랑 다르다는 것은 아래 사이트에서 알아봤습니다.
      https://alisoftware.github.io/swift/closures/2016/07/25/closure-capture-1/

      func biggerOne(_ a : Int, _ b : Int) -> Int? {
      if a == b {
      return nil
      } else if a > b {
      return a
      } else {
      return b
      }
      }

      default capture semantic
      var someClosure : (Int, Int) -> Int? = biggerOne(_:_:)
      someClosure = { (left : Int, right : Int) in
      someClosure(left , right)
      }
      print(someClosure(2,3)!)

      // 실행결과 => 런타임 에러
      //error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=2,
      //address=0x7ffee6e4ffe8).
      //The process has been left at the point where it was interrupted, use “thread
      //return -x” to return to the state before expression evaluation.

      2. using capture list (이에 대한 해결책)
      var someClosure : (Int, Int) -> Int? = biggerOne(_:_:)
      someClosure = { [someClosure] (left : Int, right : Int) in
      someClosure(left , right)
      }
      print(someClosure(2,3)!)

      // 실행결과 => 정상 작동
      // 3

      클로져 캡쳐 작동원리가 더 알고 싶다면 아래 블로그 글을 추천합니다~
      https://velog.io/@kimdo2297/%ED%81%B4%EB%A1%9C%EC%A0%B8-%EC%BA%A1%EC%B3%90%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-about-closure-capture

    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 579

      많은걸 공부했네요! ㅎㅎ 한 단계 업그레이드 된 것을 축하합니다 😀

      • Jason
        참가자
        • 글작성 : 1
        • 답글작성 : 1

        ㅋㅋㅋ 감사합니다

1 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom