문제 상황
SwiftUI의 View Struct에서 이중 배열을 만들고 상황에 맞게 내부 배열에 append와 removeLast를 하려 했으나 "Thread 1: Fatal error: Index out of range" 에러가 발생했다. 이중 배열 안에서 첫번째 배열에는 정상적으로 데이터 입출력이 되는 상황이었고 두번째 배열에 접근하려고 하면 문제가 반복되는 상황이었다
해결
@State var Record: [[String]] = [[]] // <- (X) 처음 시도한 코드(문제)
@State var Record = [[String]]() // <- (X)
//가능한 코드
@State var Record: [[String]] = [[],[],[]]
@State var Record: [[String]] = Array(repeating: Array(repeating: "" , count: 0), count: 3)
@State var Record = [[String]](repeating: Array(repeating: "" , count: 0), count: 3)
정말 기초적인 문제로 생성과 초기화가 원인이었다. 스위프트의 Array는 자동으로 크기를 조절하기 때문에 이중배열에서도 append나 remove에 문제가 발생하지 않을 것이라 봤는데 아닌듯 하다.
첫번째 Record는 이중배열로 생성되었지만 초기화를 할때 배열 내부에 배열이 하나만 들어가 있다. Record[1], Record[2]와 같은 방법으로 다루면 자동으로 두번째 세번째 배열이 생성될거라 생각했는데 아니었다. 두번째는 빈배열 생성으로 자동으로 배열의 갯수가 늘어나지 않으므로 역시 해결이 되지 않았다.
해결법은 배열을 선언할 때, 비어있는 배열의 갯수를 지정하여 초기화한 후 활용하는 것이다. 이 경우 배열 안에서 요소의 삽입, 갱신, 삭제 등을 해도 문제가 발생하지 않는다. 보다 세련된 방법(?)으로 내부에 넣어야 하는 배열이 많아질 경우 repeating을 이용하여 빠르게 많은 수의 배열을 초기화 할 수 있다.
만약 이중배열을 선언하고 사용하고 싶을 경우 안에 넣을 배열을 만든 후 append로 넣는 방법은 가능하다.
'Swift > etc' 카테고리의 다른 글
[Xcode] 디버거에서 data 타입을 사람이 볼 수 있는 방식으로 변환하는 법 (0) | 2023.03.18 |
---|---|
[UIKit] init(frame:)과 init(coder:)은 어떤 차이가 있는가? (0) | 2023.03.16 |
[Swift] Type of expression is ambiguous... 에러 (0) | 2023.03.15 |
[Swift] self와 Self의 차이점 (0) | 2023.03.11 |
[Swift] UserDefaults 사용법 정리 (0) | 2022.09.17 |