인덱스로 Array 아이템을 탐색하다보면 항상 마주하는 것이 있다. Fatal error: Index out of range
. 잘못하면 런타임에 애플리케이션이 바로 죽어버리기 마련이다. 아무리 염두에 둔다하더라도 우리는 사람인 이상 실수를 하기 마련이다.
if index < array.count {
// 작업 수행
}
이런식으로 방어코드를 짜주어야 하는데 여간 귀찮은게 아니다. 그리고 코드도 덜이쁘다.
Collection Type은 indices라는 값을 가진다. 내부에는 유효한 값의 범위를 가지고 있다.
이러한 점을 바탕으로 Subscript를 추가하여 사용한다면 보다 간결하고 안전하게 사용이 가능하다.
extension Collection {
subscript(safe index: Index) -> Iterator.Element? {
// iOS 9 이후
guard indices.contains(index) else {
return nil
}
return self[index]
// iOS 8 이전 (하위호환)
// return startIndex <= index && index < endIndex ? self[index] : nil
// return 0 <= index && index < self.count ? self[index] : nil
}
}
주의할 점은, indices가 iOS9부터 지원되기 때문에, 하위 호환을 맞추기 위해서는 위와 같이 방어 코드를 삽입해주어야 한다는 것이다.