배열 안전하게 조회

yim2627·2021년 12월 13일
4

Swift

목록 보기
30/35
post-thumbnail

배열 안전하게 조회

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
*/

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

profile
여러 사람들과 함께 많은 것을 배우고 나누리

2개의 댓글

comment-user-thumbnail
2021년 12월 15일

안녕하세요 도미닉입니다.
좋은 글 잘 읽었습니다.
글에서 indices 도 언급하셨는데 아래에서 안전하게 배열을 조회할 때 indices 를 사용하지 않은 이유가 궁금합니다.
for i in arr.indicies {
print(arr[i])
}
이런 형태도 괜찮지 않을까 생각합니다!

1개의 답글