回答:
Swiftでのエレガントな方法:
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
配列と組み合わせてスタイルコーディングを行う際の読みやすさを向上
これをより安全な方法で書き直して配列のサイズをチェックし、3項条件式を使用できます。
if let str2 = (arr.count > 2 ? arr[2] : nil) as String?
if
1つのif
ステートメントではなく2つのステートメントが必要です。私のコードでは、2つ目if
を条件演算子に置き換えて、2 else
つの別々のelse
ブロックを強制する代わりに、1つを保持できるようにしています。
if
OPからの質問全体は、Antonioの回答の「then」ブランチ内に収まるため、2つの入れ子になりますif
。私はOPsコードを小さな例として表示しているので、彼はまだを望んでいると思いますif
。彼の例if
では不要であることに同意します。しかし、その後、再びOPが配列の十分な長さを持っていないことを知っているので、文全体は、無意味であり、その要素のどれもありません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
か?