【Swift】配列の要素を安全に取り出す方法!範囲外エラーの解決法

この記事からわかること

  • Swift配列要素安全取得するには?
  • インデックス有効範囲チェックする方法
  • 範囲外エラーExecution was interrupted, reason: EXC_BREAKPOINT

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

配列の要素を安全に取り出す方法

配列の要素を取得する際に存在しないインデックスを指定すると範囲外でエラー「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)

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index