- This topic has 6개 답변, 3명 참여, and was last updated 2 years, 10 months 전에 by Ky J.
-
글쓴이글
-
-
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 확인을 하면 왜 값이 수정이 안되어있는지 궁금합니다..
이거에 대해 몇일 동안 구글링 해봤지만 찾질 못해서 글 남깁니다..
2022-01-14 오후 4:32 #51212 -
오동나무참가자
- 글작성 : 0
- 답글작성 : 16
items 배열의 모든 items[indexPath.section][indexPath.item] 의
isExpand
값은 false로 초기화되고 있습니다.그리고 switch 문에서 .caption인 경우 해당 값을 item이라는 지역 변수에 넣어주고 있습니다. 이때에는 값이 복사되지요.
지금의 코드에서는 이 복사된 값을 변경해주고 있기 때문에 원래의 값은 변경되지 않고 있습니다. 이는 구조체가
값 타입
이기 때문입니다.item.toggle()
->items[indexPath.section][indexPath.item].toggle()
로 변경해보면 어떻게 동작하는지 이해하기 더 쉬울 것 같아요.
2022-01-14 오후 5:11 #51239-
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이 뜨네요..
2022-01-14 오후 6:34 #51240
-
-
Ky J참가자
- 글작성 : 9
- 답글작성 : 3
collectionview에 들어가는 cell dataSource입니다. (독학이라 제 지식이 중구난방인거 이해 부탁드려요 ㅠㅠ)
그래서 struct으로 var로 설정했습니다. 제가 하고 싶은 게 한 색션안에 enum으로 구분된 cell 타입을 만들어서 배열로 모여 있게 하고 싶었습니다.
인스타그램 피드처럼요.. 유저 하나당 section하나.. section안에 enum으로 구분된 셀마다 데이터를 넣어 표시하는걸 구현하고 싶었습니다.
그중 일부 셀안에 있는 버튼을 클릭시 cell Height가 늘어나게 하는건데 높이가 늘어나기는 하는데 data가 수정이 안되서 cell 재사용시
다시 cell 높이가 초기화 되더라구요..
struct으로 해도 mutating으로 수정 되는걸로 알고 있어서 struct으로 했습니다..
2022-01-15 오후 3:03 #51249-
야곰키 마스터
- 글작성 : 37
- 답글작성 : 579
Value Type과 Reference Type의 활용과 특성에 대해서는 이해하고 계실까요?
만약 잘 모르고 계신다면 call by value, call by reference에 대한 이해가 선행되면 훨씬 더 좋을것 같습니다.
만약 정말로 제대로 이해하고 계시다면, 저라면 저 상황에 구조체가 아니라 클래스를 선택하거나 enum의 사용대신 다른 방법을 찾아볼 것 같습니다.
프로토콜을 활용해 보는 것도 좋은 방법이 될 수 있지 않을까 싶기도해요.
Protocol Oriented Programming에 대해 공부해보는 것도 좋고요.
방법은 다양하니, 저 방식으로 잘 해결이 안된다면 다른 방식을 강구해보는 것도 좋을것 같습니다.2022-01-15 오후 9:30 #51255
-
-
-
글쓴이글
- 답변은 로그인 후 가능합니다.