답변:
스위프트의 우아한 방법 :
let isIndexValid = array.indices.contains(index)
index >= 0 && index < array.count
최악의 경우가 아니라 n 비교.
ArraySlice
하면 첫 번째 인덱스가 0 index >= 0
이 아니므로 충분히 확인하지 못할 것입니다. .indices
대신 어떤 경우에도 작동합니다.
extension Collection {
subscript(optional i: Index) -> Iterator.Element? {
return self.indices.contains(i) ? self[i] : nil
}
}
이것을 사용하면 선택적 키워드를 색인에 추가 할 때 선택적 값을 얻을 수 있습니다. 이는 색인이 범위를 벗어난 경우에도 프로그램이 충돌하지 않음을 의미합니다. 귀하의 예에서 :
let arr = ["foo", "bar"]
let str1 = arr[optional: 1] // --> str1 is now Optional("bar")
if let str2 = arr[optional: 2] {
print(str2) // --> this still wouldn't run
} else {
print("No string found at that index") // --> this would be printed
}
optional
매개 변수 를 사용하는 동안 읽을 수 있습니다. 감사!
인덱스가 배열 크기보다 작은 지 확인하십시오.
if 2 < arr.count {
...
} else {
...
}
extension Collection {
subscript(safe index: Index) -> Iterator.Element? {
guard indices.contains(index) else { return nil }
return self[index]
}
}
if let item = ["a", "b", "c", "d"][safe: 3] { print(item) }//Output: "d"
//or with guard:
guard let anotherItem = ["a", "b", "c", "d"][safe: 3] else {return}
print(anotherItem) // "d"
if let
배열과 함께 스타일 코딩을 수행 할 때 가독성 향상
배열의 크기를 확인하기 위해 더 안전한 방법으로 이것을 다시 작성하고 삼항 조건을 사용할 수 있습니다.
if let str2 = (arr.count > 2 ? arr[2] : nil) as String?
if
하나의 if
명령문 대신 두 개의 명령문이 필요 합니다. 내 코드는 두 번째 if
를 조건부 연산자로 대체하여 두 else
개의 별도 else
블록 을 강제하지 않고 단일을 유지할 수 있습니다 .
if
OP의 질문에서 전체 는 Antonio의 답변의 "then"분기 안에 들어가므로 두 개의 중첩 된 if
s가 있습니다. OPs 코드를 작은 예로보고 있으므로 그가 여전히을 원한다고 가정합니다 if
. 그의 모범에서 if
필요하지 않다는 것에 동의 합니다. 영업 이익은 배열이 충분한 길이를 가지고 있지 않는 것을 알고, 그 요소의 어느 것도 없기 때문에하지만 다시, 전체 문장은, 무의미 nil
그가를 제거 할 수 있도록, if
단지의 유지 else
블록.
나를 위해 나는 같은 방법을 선호합니다.
// MARK: - Extension Collection
extension Collection {
/// Get at index object
///
/// - Parameter index: Index of object
/// - Returns: Element at index or nil
func get(at index: Index) -> Iterator.Element? {
return self.indices.contains(index) ? self[index] : nil
}
}
@ Benno Kress 덕분에
extension Array {
func isValidIndex(_ index : Int) -> Bool {
return index < self.count
}
}
let array = ["a","b","c","d"]
func testArrayIndex(_ index : Int) {
guard array.isValidIndex(index) else {
print("Handle array index Out of bounds here")
return
}
}
indexOutOfBounds 처리하는 것이 좋습니다 .
index < array.count
?