본문 바로가기
iOS/Swift

[Swift] 배열 안전하게 조회

by Jiseong 2022. 2. 13.

배열 안전하게 조회

indices

그 전에 indices에 대해 알아보자

해당 프로퍼티는 Collection 타입의 프로퍼티이다.

 

이 프로퍼티는 Collection의 유효 범위를 갖고있는 프로퍼티이다.

 

예를 들어 arr이라는 배열의 요소가 [1, 2, 3, 4, 5]로 5개의 요소를 갖고있으므로 indices의 값은 0..<5으로 유효한 범위를 갖는다.

 

예제

조회

그럼 이제 배열을 안전하게 조회하는 방법을 알아보자

 

난 subscript를 쓸 것이다.

 

배열이 가진 유효한 범위를 벗어나면 아래와 같이 Out Of Range 에러가 뜬다.

arr의 유효 범위는 0...4까지인데, 반복문 안에서 5까지 프린트할라니 런타임 에러가 발생하는 것이다.

 

런타임 에러가 발생하면.. 프로그램은 죽겠지 그래서 우린 이런 상황을 피해야 한다.

 

대비할 수 있는 방법은 nil을 그대로 내뱉어 런타임 에러가 발생하는 상황을 방지하는 것이다.

 

Array를 확장하여 유효한 인덱스라면 인덱스에 맞는 요소를 반환하고 유효하지 않은 인덱스라면 nil을 옵셔널로 씌워 반환하는 subscript를 추가하여 nil이 나오면 안전히 처리할 수 있게끔 만들어주면 된다.

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

근데 이게 문제가 전달인자 레이블 안붙이면 컴파일러가 애플이 만든 subscript랑 구별을 못한다.

모호하단다.

 

그래서.. 너무 보기 안좋지만 붙여줬다

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

for i in 0...10 {
    if arr[index: i] != nil {
        print(arr[index: i]!)
    } else {
        print(arr[index: i])
    }
}

/* 출력
1
2
3
4
5
nil
nil
nil
nil
nil
nil
*/

그냥 테스트 코드라 강제언래핑해줬지만 실제 사용할 땐 바인딩 해줘야겠지?

 

따로 익스텐션 안만들고 이렇게 간단하게 사용도 가능하다.

for i in arr.indicies {
	print(arr[i])
}

 

의견 내주신 도미닉 감사합니다.

 

댓글