📌 안전하게 배열에 접근하는 방법
-> 하단의 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 |