You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
안녕하세요. 애플 디벨로퍼 아카데미 3기 구리스입니다.
NC1을 진행하면서 생겼던 트러블 이슈와 이를 해결했던 경험에 대해 공유하고자 첫 글을 작성해봅니다 :)
앞으론 빨리빨리 글을 쓰는 습관을 .. 가져보도록 하겠습니다!
Problem
각 챌린지별로 여러개의 노트를 보여주는 뷰를 짜는 도중에, 해당 노트의 제목은 day~로 등록되게 했습니다.
day 뒤에 오는 숫자는 Note.number로 관리되게 하고 해당 값으로 정렬하여 노트들이 보일 수 있도록 했습니다.
List {
ForEach(challenge.notes.sorted(by: { $0.number < $1.number })) { note in
ChallengeDayRow(number: note.number, isSelected: note.number == selectedIndex)
.onTapGesture {
selectedIndex = note.number
}
.listRowSeparator(.hidden)
}
.onDelete { indexSet in
for index in indexSet {
deleteNote(challenge.notes[index])
}
}
Note.number로 오름차순 정렬하기 위해 challenge.notes.sorted(by: { $0.number < $1.number })로 코드를 구현했습니다.
이때 생겼던 이슈는 onDelete로 노트를 삭제할 때 제가 스와이프 했던 노트가 삭제되는 것이 아닌, 다른 노트가 삭제되는 이슈가 있었습니다.
어떻게 해결해야할지 큰 어려움이 있었고 index로 delete를 접근해서 그런건가..? 라는 고민이 많이 있었습니다.
Solution
NC1 체크인 타임에 제가 겪고 있는 이슈를 공유했고, 오후 러너분 중 보노라는 분이 저의 이슈를 해결하러 와주셨습니다!! (샤라웃 보노🦭)
제가 List-ForEach 안에 사용한 sorted가 문제가 된 것 같다고 말씀해주셨습니다. sorted는 배열 안의 객체의 index자체를 변경하여 정렬시켜주는 것이 아닌 정렬된 배열만을 반환해주는 것이었습니다.
그렇기 때문에 원본 배열의 index는 변경되지 않고 정렬된 사본 배열을 반환한 것이라 onDelete 해줄 때의 index와 매칭이 안된 것이었습니다 ! ! !
.onDelete { indexSet in
if let firstIndex = indexSet.first {
selectedIndex = challenge.notes.sorted(by: { $0.number < $1.number })[firstIndex].number
challenge.notes.removeAll(where: { $0.number == selectedIndex })
}
}
따라서 저는 onDelete 내의 index를 다시 오름차순으로 sorting하여 삭제 요청을 받은 indexSet의 첫번째 index인 Note.number를 selectedIndex에 저장하고, selectedIndex와 challenge.notes배열 안의 객체의 number가 같은 객체를 모두 삭제하도록 구현했습니다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
Swift의 sort와 sorted를 알아보자!
안녕하세요. 애플 디벨로퍼 아카데미 3기 구리스입니다.
NC1을 진행하면서 생겼던 트러블 이슈와 이를 해결했던 경험에 대해 공유하고자 첫 글을 작성해봅니다 :)
앞으론 빨리빨리 글을 쓰는 습관을 .. 가져보도록 하겠습니다!
Problem
각 챌린지별로 여러개의 노트를 보여주는 뷰를 짜는 도중에, 해당 노트의 제목은 day~로 등록되게 했습니다.
day 뒤에 오는 숫자는
Note.number
로 관리되게 하고 해당 값으로 정렬하여 노트들이 보일 수 있도록 했습니다.Note.number
로 오름차순 정렬하기 위해challenge.notes.sorted(by: { $0.number < $1.number })
로 코드를 구현했습니다.이때 생겼던 이슈는
onDelete
로 노트를 삭제할 때 제가 스와이프 했던 노트가 삭제되는 것이 아닌, 다른 노트가 삭제되는 이슈가 있었습니다.어떻게 해결해야할지 큰 어려움이 있었고 index로 delete를 접근해서 그런건가..? 라는 고민이 많이 있었습니다.
Solution
NC1 체크인 타임에 제가 겪고 있는 이슈를 공유했고, 오후 러너분 중 보노라는 분이 저의 이슈를 해결하러 와주셨습니다!! (샤라웃 보노🦭)
제가 List-ForEach 안에 사용한 sorted가 문제가 된 것 같다고 말씀해주셨습니다.
sorted
는 배열 안의 객체의 index자체를 변경하여 정렬시켜주는 것이 아닌 정렬된 배열만을 반환해주는 것이었습니다.그렇기 때문에 원본 배열의 index는 변경되지 않고 정렬된 사본 배열을 반환한 것이라
onDelete
해줄 때의 index와 매칭이 안된 것이었습니다 ! ! !따라서 저는 onDelete 내의 index를 다시 오름차순으로 sorting하여 삭제 요청을 받은
indexSet
의 첫번째 index인 Note.number를selectedIndex
에 저장하고,selectedIndex
와challenge.notes
배열 안의 객체의 number가 같은 객체를 모두 삭제하도록 구현했습니다.Learning
sort
와sorted
sort
: 원본 배열을 기본적으로 오름차순으로 정렬합니다.내림차순으로 정렬하고 싶다면
sort(by: >)
를 사용합니다.sorted
: 원본 배열은 건드리지 않고 사본을 만들어서 정렬된 배열을 반환합니다.내림차순으로 정렬하고 싶다면
sorted(by: >)
를 사용합니다.List-ForEach를 통해 리스트를 구현할 때 정렬을 하고 싶다면 해당 부분을 고려해보면 좋을 것 같습니다!!
+)
indexSet
이 아닌item
으로 접근하여 리스트 내 객체를 삭제할 수 있는swipeAction
도 있다는 말을 들었습니다!!다양한 방법으로 리스트 내 객체를 삭제하는 방법이 있다는 걸 알게 되었습니다.
잘못된 설명이 있거나 추가하고싶은 내용 있으시면 언제든지 댓글 달아주세요! 😊
Beta Was this translation helpful? Give feedback.
All reactions