UITableView
에서 데이터를 삭제할 때 Index out of range
오류가 발생하는 경우가 있다.
다들 알다시피 이 오류는 Index가 설정된 범위를 넘어버릴 경우 발생되는 에러이다.
나의 경우엔 배열의 요소가 제거된 상태에서 접근을 시도하여 발생했다.
이 글에서는 이 오류의 원인과 해결 방법을 정리한다.
문제 상황
테이븗에서 deleteRows(at:with:)
를 호출할 때 다음과 같은 오류가 발생했다.
Fatal error: Index out of range
이 오류는 보통 아래 두 가지 원인으로 발생한다.
데이터 배열을 먼저 업데이트 하지 않음
삭제 후 테이블뷰의 데이터소스를 업데이트하지 않음
해결 방안
데이터 배열을 먼저 업데이트 하지 않은 경우
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { tableView.deleteRows(at: [indexPath], with: .automatic) // ❌ 먼저 삭제 dataArray.remove(at: indexPath.row) // ❌ 나중에 배열 업데이트 → Index out of range 오류 발생 } }
deleteRows(at:)
를 먼저 실행하면, UITableView는 데이터가 여전히 존재한다고 가정함그 후
dataArray.remove(at:)
를 실행하면 배열의 크기가 줄어들어 Index 오류 발생먼저 데이터 배열을 업데이트한 후
deleteRows(at:)
를 호출if editingStyle == .delete { dataArray.remove(at: indexPath.row) // ✅ 먼저 배열에서 삭제 tableView.deleteRows(at: [indexPath], with: .automatic) // ✅ 이후에 UI 업데이트 }
삭제 후 테이블뷰의 데이터소스를 업데이트하지 않은 경우
테이블뷰가
numberOfRowsInSection
을 호출할 때, 데이터 배열의 크기와 일치하지 않으면Index out of range
오류 발생삭제 후 테이블뷰를 안전하게 리로드
if editingStyle == .delete { dataArray.remove(at: indexPath.row) if dataArray.isEmpty { tableView.reloadData() // ✅ 데이터가 없으면 전체 리로드 } else { tableView.deleteRows(at: [indexPath], with: .automatic) } }