클로저에서 값참조 관련 문의드립니다~

2 답변 글타래를 보이고 있습니다
  • 글쓴이
    • 석수
      참가자
      • 글작성 : 6
      • 답글작성 : 2

      안녕하세요…
      클로저 관련해서 공부를 하고 있습니다
      클로저에서 값을 사용할때.. 구조체는 참조가 아닌 값 복사로 이해를 하고 있었는데요,
      아래의 케이스에서 2번째 print(b()) 가 5로 찍히는 이유가 이해가 잘 안되고 있어서 문의드립니다.

      struct Person{
               var age:Int = 10
      }
      var a = Person()
      func temp() -> (()->Int) {
             func getAge() -> Int{
                    return a.age
             }
      }
      let b:(()->Int) = temp()
      print(b())
      a.age = 5
      print(b())
      
    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 580

      클로저 장인 Jason( @googleuser4)
      설명해 주실 수 있을까요?

    • nobleidea
      참가자
      • 글작성 : 5
      • 답글작성 : 8
      var a = 0
      var c = { print(a) }
      c() // 0
      a = 5
      c() // 5
      

      클로저 캡처, 캡처리스트에 대해서 찾아보시면 좋을 것 같습니다.
      클로저 캡처를 사용한 경우입니다.
      클로저 캡처의 경우 swift에서는 값복사가 아닌 참조복사로 이루어집니다.
      옵젝시의 경우에는 값복사로 이루어지는 차이점이죠…

      var a = 0
      var c = { [a] in print(a) }
      c() // 0
      a = 5
      c() // 0
      

      위와 같이 캡처리스트를 사용하면 캡처당시의 값을 그대로 사용할 수 있습니다.
      캡처리스트 사용시 value type, reference type 차이점이 있으니 이 부분은
      공부하시면 좋을 것 같습니다…(ARC에 대해서 먼저 학습하시는 것도 좋을 것 같습니당 ㅎㅎ 경험상..)
      명확하게 설명을 드렸는지 모르겠네요.. 우연히 최근에 배웠던 내용이라..
      끄적여봅니다..
      잘못된 점이 있다면… 알려주세요 ㅠㅠ ! 감사합니다.

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

logo landscape small

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