본문 바로가기
모바일앱/Swift

안전하게 배열에 접근하는 3가지 방법

by GeekCode 2022. 3. 10.
반응형

📌 안전하게 배열에 접근하는 방법

 -> 하단의 2번째 방법을 함수화한 방법

 

 

일반적으로 배열에 index를 통해 접근하는 상황을 최소화해야하는 것이 옳지만 어쩔 수 없는 상황이 발생하곤 한다.

Swift에서는 좀 더 안전한 처리를 위해 함수 단에서 guard를 지원합니다.

하지만 Array의 경우 index를 통해 접근해서 가져오는 값이 Optional타입이 아니기 때문에 접근하는 index가 유효하지 않은 경우에는 꼼짝없이 Fatal error: Index out of range 메세지가 발생합니다.

let arr = [1,2,3,4]
arr[4] // Fatal error: Index out of range

예를 들어 API통신을 통해 배열이 생성되는데 생성한 배열에 값이 추가 되지않은 경우, 호출을 하게 되면 앱이 종료 될 수가 있습니다. 추가적으로 예외처리를 해줄 수는 있겠지만 처음부터 안전한 방법을 만들면 추가적인 예외처리가 없어도 되겠죠.

해당 Array를 index를 통해 접근했을 때 Optional 타입으로 반환 해주면

명시적인 장치를 통해서 해당 index에 값이 존재하지 않는 상황에 대한 예외 처리를 진행할 수 있기 때문에 비교적 안전하게 배열에 접근을 진행할 수 있습니다.

아래 Extension을 추가하면 해당 배열에 접근하려는 index가 유효한지 판단한 뒤 유효할 경우 실제 Element를 반환하고 아닌 경우 nil 값을 넘겨주게 됩니다.

extension Collection {
    subscript (safe index: Index) -> Element? {
        return indices.contains(index) ? self[index] : nil
    }
}

실제로 적용한 예는 아래와 같습니다.

let arr = ["a", "aa", "aaa", "aaaa", "aaaaa", "aaaaaa"]

func getElementCount(_ index: Int) -> Int {
    guard let value = arr[safe: index] else { return 0 }
    return value.count
}

(-5..<10).forEach {
    print("\\($0) : \\(getElementCount($0))")
}

/* 
[RESULT]
-2 : 0
-1 : 0
0 : 1
1 : 2
2 : 3
3 : 4
4 : 5
5 : 6
6 : 0
7 : 0
*/

📌 추가적으로 안전하게 배열에 접근하는 방법

⭐️ isNotEmpty

: 해당 배열에 값이 들어 있는지 파악하는 방식으로 위의 에러를 피할 수 있습니다.

...
if people.isNotEmpty {
  ...
  print(people[0].name)
  ...
  people.remove(people[0])
}

이렇게 한다면 안전하겠지만 대신 print문에서 0번째 인덱스를 접근하는 첨자 참조 크래시가 발생할 수도 있습니다.

이에 아래에는 조금 더 안전한 방법입니다.

⭐️ ‼️safe‼️ [가장 추천]

: safe로 해당 배열이 있는지 판단하고 접근 ( 위에서 소개한 내용 )

중간에 중간에 있는 인덱스를 안전하게 조회/접근할 때

if let person = people[safe: 0] {
  ...
  print(person.name)
  ...
  people.remove(person)
}

safe로 해당 배열의 인덱스 값이 있는지 안전하게 조회하고 접근하여 사용한다면 print에서 첨자 참조 크래시를 방지할 수 있습니다.

⭐️ first

: 인덱스의 첫번째 요소 접근

if let person = people.first {
  ...
  print(person.name)
  ...
  people.remove(person)
}

이렇게 옵셔널 바인딩 부분에서 first로 접근한다면 첨자 참조 크래시도 나지 않고 안전하게 접근 및 사용할 수 있습니다.

이렇게 간단한 배열 조회에도 다양하고 안전하게 접근하는 방법에 대해 알아봤습니다.

반응형

'모바일앱 > Swift' 카테고리의 다른 글

저장프로퍼티 - 프로퍼티(1)  (0) 2022.11.21
mutating 과 구조체  (0) 2022.04.13
[ios] shortening unwrapping 쇼트닝 언래핑 swift5.7  (0) 2022.04.12
TIL220324_에러처리 Do try catch  (0) 2022.03.24
Codable  (0) 2022.02.11
CustomCell 만들기 (미완성)  (0) 2021.12.26
와일드카드 식별자  (0) 2021.12.20
for 문에서의 제어전달문 보충  (0) 2021.12.16