【Swift】配列の要素を検索してインデックスを取得する方法!first/firstIndex

この記事からわかること

  • Swift配列要素インデックス取得するには?
  • firstfirstIndex使い方
  • 条件式渡し方
  • $0意味
  • whereof違い
  • ディクショナリ型注意点

index

[open]

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

みんなの誕生日

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

posted withアプリーチ

Swiftで配列を扱うときにデータ内の特定の要素やそのインデックス番号を検索して取得する方法をまとめていきます。

配列の中の条件に合った要素を取得する

配列に複数格納されている要素の中で特定の条件に合った要素を取得するにはfirstメソッドを使用します。

firstメソッドの使い方

array.first

firstメソッドは、先頭から要素を検索し最初にマッチする要素を返します。マッチする要素がない場合はnilを返します。

条件を指定しない場合

let language = ["HTML","CSS","JavaScript","PHP","Swift"]

if let lang = language.first {
    print(lang) // HTML
}

返り値はオプショナル型になるのでオプショナルバインディングで取得しないと以下のようなエラーになるので注意してください。

Cannot call value of non-function type 'String?

first(where:)で条件式を渡す

first(where:)メソッド形式でwhereクロージャ形式で条件式を渡すことでその条件にマッチした要素を取得することができます。クロージャ内では$0疑似的な要素に参照することができます。

let language = ["HTML","CSS","JavaScript","PHP","Swift"]
if let lang = language.first(where: { $0 == "HTML" }) {
    print(lang) // HTML
}

配列の要素が数値の場合は比較式も使用できます。

let numbers = [3, 5, -12, 43, -4, 10]
if let firstNum = numbers.first(where: { $0 > 4 }) {
    print(firstNum) // 5
}

whereを省略して条件式を以下の形式で渡すことも可能です。

let firstNum = numbers.first {
    $0 > 4
}
print(firstNum) // 5

containsを使用して文字列を含む要素を取得

containsメソッドを駆使すれば特定の文字列を含む要素を取得することも可能です。

let language = ["HTML","CSS","JavaScript","PHP","Swift"]
if let lang = language.first(where: { $0.contains("wif")}) {
    print(lang) // Swift
}

配列の中の条件に合った要素インデックスを取得する

配列に複数格納されている要素の中で特定の条件に合った要素インデックスを取得するにはfirstIndexメソッドを使用します。

firstIndexメソッドの使い方

array.firstIndex(of:)

firstIndexメソッドは、先頭から要素を検索し最初にマッチする要素インデックスを返します。マッチする要素がない場合はnilを返します。

firstIndexメソッドはfirstIndex(of:)形式で使用します。引数ofには値を渡し、その値と完全に一致する要素のインデックス番号を返します。

let language = ["HTML","CSS","JavaScript","PHP","Swift"]
if let index = language.firstIndex(of: "Swift") {
    print(index) // 4
}

条件式で要素インデックスを取得する

first(where:)メソッド同様の使用方法でfirstIndex(where:)メソッドが扱えるので条件式にマッチした要素インデックスを取得することも可能です。

let language = ["HTML","CSS","JavaScript","PHP","Swift"]
if let index = language.firstIndex(where: {$0.hasPrefix("S")}) {
    print(index) // 4
}

ディクショナリ型(連想配列)の注意点

firstメソッドはディクショナリ型でも使用可能ですが、その際は返り値が不安定になるので注意が必要です。

let language = ["HTML":5,"CSS":3,"JavaScript":1,"PHP":8,"Swift":5]
if let lang = language.first {
    print(lang.key) // Swift
    print(lang.value) // 5
}

// 2回目
// JavaScript
// 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.

これを防ぐために以下のように記述できる拡張コードを紹介していますので参考にしてください。

print(array[safe: 3] ?? 0)

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

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

searchbox

スポンサー

ProFile

ame

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

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

New Article

index