【Swift】配列の要素を安全に取り出す方法!範囲外エラーの解決法
この記事からわかること
- Swiftで配列の要素を安全に取得するには?
- インデックスの有効範囲をチェックする方法
- 範囲外エラー:Execution was interrupted, reason: EXC_BREAKPOINT
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:14.3.1
- iOS:16.4
- Swift:5.8.1
配列の要素を安全に取り出す方法
配列の要素を取得する際に存在しないインデックスを指定すると範囲外でエラー「Execution was interrupted, reason: EXC_BREAKPOINT
」を吐きます。
let array = ["A","B","C"]
print(array[3])
error: Execution was interrupted, reason: EXC_BREAKPOINT (code=1, subcode=0x18bcdc794).
The process has been left at the point where it was interrupted, use "thread return -x" to return to the state before expression evaluation.
このエラーが発生するとアプリがクラッシュしてしまうので範囲外にアクセスしないように最初にインデックスが有効かどうかをチェックすると安全なのですが、これを解決する方法として良い方法があったので共有しておきます
範囲外かどうかをチェックする方法
範囲外かどうかをチェックするにはindices
でインデックスの配列を取得し、contains
でその中に対象のインデックス番号が存在するかをチェックすることで安全に配列の要素を取得することができます。
if array.indices.contains(index) {
print("存在するよ")
} else {
print("存在しないよ")
}
これを頭の良いかたがCollection
を拡張して以下のように実装されていました。
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
}
}
参考文献(引用):Safe (bounds-checked) array lookup in Swift, through optional bindings?
これにより以下のように記述することができるようになります。
print(array[safe: 3] ?? 0)
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。