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

この記事からわかること
- Swiftで配列の要素インデックスを取得するには?
- firstやfirstIndexの使い方
- 条件式の渡し方
- $0の意味
- whereやofの違い
- ディクショナリ型の注意点
index
[open]
\ アプリをリリースしました /
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)
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。