[解決済み】Swiftで安全な(境界がチェックされた)配列検索、オプションのバインディングを通して?
2022-03-28 20:06:26
質問
Swiftで配列を持っていて、境界外のインデックスにアクセスしようとすると、当然のことながらランタイムエラーが発生します。
var str = ["Apple", "Banana", "Coconut"]
str[0] // "Apple"
str[3] // EXC_BAD_INSTRUCTION
しかし、私は、すべてのオプションのチェーンと 安全性 のようなことをするのは簡単でしょう。
let theIndex = 3
if let nonexistent = str[theIndex] { // Bounds check + Lookup
print(nonexistent)
...do other things with nonexistent...
}
の代わりに
let theIndex = 3
if (theIndex < str.count) { // Bounds check
let nonexistent = str[theIndex] // Lookup
print(nonexistent)
...do other things with nonexistent...
}
しかし、これでは、オールドの
if
ステートメントでチェックし、インデックスが
str.count
.
を自分で追加してみました。
subscript()
の実装がありますが、元の実装に呼び出しを渡す方法や、添え字記法を使わずにアイテムにアクセスする方法(インデックスベース)がよく分かりません。
extension Array {
subscript(var index: Int) -> AnyObject? {
if index >= self.count {
NSLog("Womp!")
return nil
}
return ... // What?
}
}
解決方法は?
アレックスの回答 は良いアドバイスと解決策を提供してくれますが、私は偶然にもこの機能を実装するもっと良い方法を見つけました。
Swift 3.2 以降
extension Collection {
/// Returns the element at the specified index if it is within bounds, otherwise nil.
subscript (safe index: Index) -> Element? {
return indices.contains(index) ? self[index] : nil
}
}
Swift 3.0と3.1
extension Collection where Indices.Iterator.Element == Index {
/// Returns the element at the specified index if it is within bounds, otherwise nil.
subscript (safe index: Index) -> Generator.Element? {
return indices.contains(index) ? self[index] : nil
}
}
を思いついたHamishの功績は大きい。 Swift 3 のためのソリューション .
使用例
let array = [1, 2, 3]
for index in -20...20 {
if let item = array[safe: index] {
print(item)
}
}
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] NSTimerでカウントダウンを作るには?
-
[解決済み] Xcodeログ "Writing analzed variants".
-
[解決済み] Xcodeのコマンドラインツールがインストールされているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Xcodeの古いバージョンはどこでダウンロードできますか?[クローズド]
-
[解決済み】Xcode 5でProvisioning Profilesメニューが表示されない。
-
[解決済み】Xcodeでコードをフォーマットする方法は?[重複している]。
-
[解決済み】Swiftで安全な(境界がチェックされた)配列検索、オプションのバインディングを通して?
-
[解決済み】Mac OS X 10.8 / Xcode 4.4でgccを使用/インストールする方法
-
[解決済み】OSXのXcodeを最新バージョンにアップデートする方法は?
-
[解決済み】Xcodeのビルドフォルダはどこですか?