본문 바로가기
IOS App Programming/Swift

배열 Safe Index - 안전하게 배열 조회하기

by B_Tori 2024. 2. 29.

배열은 인덱스를 통해 빠른 접근이 가능하다.

하지만 인덱스 범위를 넘게 되면 런타임 에러가 발생해 앱을 강제 종료 시킬 수 있어 치명적이다.

프로젝트 진행 중 인덱스를 접근할 일이 많았고, 이는 위험성을 가지고 있기 때문에 멘토님께서 safe Index를 사용하는 방법을 권유하셨다.

따라서 앱에서 인덱스를 통한 접근이 필요할 시 subscript를 사용하여 안전하게 접근할 수 있는 방법을 간단하게 정리해 보겠다.

extension Array {
    subscript (safe index: Int) -> Element? {
        return indices ~= index ? self[index] : nil
    }
}

indices는 Collection 타입의 유효범위를 나타낸다.

예를 들어 arr = [1,2,3] 일 때 indices를 출력하면 0.. <3이라는 범위값을 얻을 수 있다.

즉 범위를 체크하는 ~= 연산자를 통해 해당 인덱스가 Array의 범위에 속하는지 확인하고

만약 범위를 벗어나는 값이라면 nil을 반환해 준다.

옵셔널로 값을 반환하여 옵셔널 언랩핑의 과정을 거쳐야 하지만,
범위를 벗어날 시 런타임 에러가 아니라 nil 값을 받아 프로그램을 강제종료 시키지 않고 에러를 핸들링할 수 있다.

  • print(arr[safe: 1]) : safe Index를 통한 접근으로 범위 안에 속하여 옵셔널로 래핑 된 원소 값을 반환한다.
  • print(arr[safe: 3]) : safe Index를 통한 접근으로 범위를 벗어나 nil을 반환한다.
  • print(arr[3]) : safe Index가 아닌 일반적인 접근으로 범위를 벗어나면 out of range 에러를 발생시킨다.

 

indices는 IOS 9부터 사용 가능하기 때문에 하위 버전의 경우는 startIndex, endIndex를 사용하여 안전하게 배열을 조회할 수 있다.

extension Array {
    subscript (safe index: Int) -> Element? {
        return startIndex <= index && index < endIndex ? self[index] : nil
    }
}

똑같은 결과를 확인할 수 있다.

 

댓글