struct타입인 배열을 수정하는 방법에 대해 궁금합니다.

2 답변 글타래를 보이고 있습니다
  • 글쓴이
    • Ky J
      참가자
      • 글작성 : 9
      • 답글작성 : 3
      struct PostItem: Hashable {
      
          let username: String
      
          let body: String
      
          var isExpand: Bool
      
          let identifier = UUID()
      
          
      
          init(username: String, body: String) {
      
              self.username = username
      
              self.body = body
      
              self.isExpand = false
      
          }
      
          
      
          init(item: PostItem) {
      
              self.username = item.username
      
              self.body = item.body
      
              self.isExpand = false
      
          }
      
          
      
          mutating func toggle() {
      
              self.isExpand = true
      
          }
      
          
      
          func hash(into hasher: inout Hasher) {
      
              hasher.combine(identifier)
      
          }
      
          
      
          static func == (lhs: PostItem, rhs: PostItem) -> Bool {
      
              return lhs.identifier == rhs.identifier
      
          }
      
      }
      enum ItemsType: Hashable {        
      
              case poster(viewModel: PostItem)
      
              case post(viewModel: PostItem)
      
              case liker(viewModel: PostItem)
      
              case caption(viewModel: PostItem)
      
              case reple(viewModel: PostItem)
      
              case comment(viewModel: PostItem)
      
          }
      
       
      
      var items: [[ItemsType]] = []
      
       
      
      switch items[indexPath.section][indexPath.item] {
      
              case .caption(var item):
      
                  item.toggle()
      
                  print(item.isExpand) // 여기선 ture로 변경이 되는데
      
              default: break
      
              }
      
              print(items[indexPath.section][indexPath.item]) // 변경 후 false로 되어있더라구요 ㅠㅠ
      
      

      switch부분에서 mutating으로 값을 변경하면 되는데 수정 후 items 확인을 하면 왜 값이 수정이 안되어있는지 궁금합니다.. 

       

      이거에 대해 몇일 동안 구글링 해봤지만 찾질 못해서 글 남깁니다..

    • 오동나무
      참가자
      • 글작성 : 0
      • 답글작성 : 16

      items 배열의 모든 items[indexPath.section][indexPath.item] 의isExpand 값은 false로 초기화되고 있습니다.

      그리고 switch 문에서 .caption인 경우 해당 값을 item이라는 지역 변수에 넣어주고 있습니다. 이때에는 값이 복사되지요.

      지금의 코드에서는 이 복사된 값을 변경해주고 있기 때문에 원래의 값은 변경되지 않고 있습니다. 이는 구조체가 값 타입이기 때문입니다.

       

      item.toggle()  -> items[indexPath.section][indexPath.item].toggle()

      로 변경해보면 어떻게 동작하는지 이해하기 더 쉬울 것 같아요.

       

      • Ky J
        참가자
        • 글작성 : 9
        • 답글작성 : 3

        답변감사드립니다! ㅠㅠㅠ

         

        case .caption(var item): 이 부분에서 복사 된 값이 쓰이는군요.. 말씀하신대로 코드를 짜면

         

        items[indexPath.section][indexPath.item]. 뒤에 toggle이 안됩니다.. 저도 그걸 원했었는데 안되서 Switch를 쓴건데..

         

        Value of type ‘TestViewController.ItemsType’ has no member ‘toggle’ 경고창이 뜹니다.. postItem을 수정 해야되는데

         

        enum이 뜨네요..

         

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

      코드의 전체적인 구조와 목적을 완벽하게는 모르겠지만, 저 방법대로 구현하고 싶다면 PostItem을 class로 정의해야 할 것 같아요.
      PostItem을 클래스로 정의하지 않은 이유가 따로 있을까요?

      • Ky J
        참가자
        • 글작성 : 9
        • 답글작성 : 3

        collectionview에 들어가는 cell dataSource입니다. (독학이라 제 지식이 중구난방인거 이해 부탁드려요 ㅠㅠ) 

        그래서 struct으로 var로 설정했습니다. 제가 하고 싶은 게 한 색션안에 enum으로 구분된 cell 타입을 만들어서 배열로 모여 있게 하고 싶었습니다.

        인스타그램 피드처럼요.. 유저 하나당 section하나.. section안에 enum으로 구분된 셀마다 데이터를 넣어 표시하는걸 구현하고 싶었습니다.

        그중 일부 셀안에 있는 버튼을 클릭시 cell Height가 늘어나게 하는건데 높이가 늘어나기는 하는데 data가 수정이 안되서 cell 재사용시

        다시 cell 높이가 초기화 되더라구요..

        struct으로 해도 mutating으로 수정 되는걸로 알고 있어서 struct으로 했습니다..

         

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

          Value Type과 Reference Type의 활용과 특성에 대해서는 이해하고 계실까요?
          만약 잘 모르고 계신다면 call by value, call by reference에 대한 이해가 선행되면 훨씬 더 좋을것 같습니다.
          만약 정말로 제대로 이해하고 계시다면, 저라면 저 상황에 구조체가 아니라 클래스를 선택하거나 enum의 사용대신 다른 방법을 찾아볼 것 같습니다.
          프로토콜을 활용해 보는 것도 좋은 방법이 될 수 있지 않을까 싶기도해요.
          Protocol Oriented Programming에 대해 공부해보는 것도 좋고요.
          방법은 다양하니, 저 방식으로 잘 해결이 안된다면 다른 방식을 강구해보는 것도 좋을것 같습니다.

          • Ky J
            참가자
            • 글작성 : 9
            • 답글작성 : 3

            값타입과 참조 타입을 제가 정확히 파악을 못하고 있는거 같아요.. ㅎㅎ

            알려주신 걸 토대로 공부해보겠습니다~ 감사합니다~~!

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

logo landscape small

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