- This topic has 2개 답변, 2명 참여, and was last updated 4 years, 9 months 전에 by Jason.
-
글쓴이글
-
-
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-capture2020-02-29 오전 11:25 #1653 -
-
-
글쓴이글
- 답변은 로그인 후 가능합니다.