カテゴリー: iOS

Swiftの配列、辞書関連メソッドの基本

はじめに

普段はRubyやPHPを学習しておりますが、少しSwiftの配列、ハッシュ(辞書)型のメソッドを教えていただきました。
せっかくなので記事にしたいと思います。

同じような境遇(あまりアプリ側に触れない)の方に、「へ〜、そうなんだ」と思ってもらえたら嬉しいです。
本日取り上げるのは、Ruby on Railsで馴染み深いメソッドのSwift版になります。

配列(Array)

まずは配列です。
例として、下記を使用します。

// Array
var numbers: [Int] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

filter

クロージャで指定した条件を満たす、新しい配列を返却します。

例として、2の倍数を取得する処理を記述します。

let evenNumbers: [Int] = numbers.filter { (value: Int) -> Bool in
    return value % 2 == 0
}
print(evenNumbers)
// => [0, 2, 4, 6, 8]

上記のようにクロージャを渡すのですが、第一引数に$0でアクセスでき、下記のように簡略にすることもできます。

let evenNumbers: [Int] = numbers.filter { $0 % 2 == 0 }
print(evenNumbers)
// => [0, 2, 4, 6, 8]

map

配列の1つ1つにクロージャで指定した処理を行った配列の結果を返却します。

例として、1つ1つの要素を2倍にする処理を記述します。

let doubleNumbers: [Int] = numbers.map { (value: Int) -> Int in
    return value * 2
}
print(doubleNumbers)
// => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

簡略式も下記に記載します。

let doubleNumbers: [Int] = numbers.map { $0 * 2 }
print(doubleNumbers)
// => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

reduce

要素のたたみ込みをするためのメソッドです。要素をまとめて一つにする場合などで利用できます。

例として、要素の合計値を取得する処理を記述します。

let totalNumber = numbers.reduce(0) { (total: Int, value: Int) -> Int in
    total + value
}
print(totalNumber)
// => 45

簡略式も下記に記載します。

let totalNumber = numbers.reduce(0) { $0 + $1 }
print(totalNumber)
// => 45

辞書(Dictionary)

辞書に関しても上記のfiltermapreduceのメソッドは使えます。簡略式ですが、こちらも記載しておきます。

まずは、例で操作対象となる辞書を宣言しておきます。

// Dictionary
var dictNumbers = ["zero":0, "one": 1, "two": 2, "three": 3 , "four": 4, "five": 5, "six": 6, "seven": 7, "eight": 8, "nine": 9]

filter

Dictionaryのため、順序保証がないのと、返却値はタプルの配列になっています。

let evenDictNumbers = dictNumbers.filter { $0.1 % 2 == 0 }
print(evenDictNumbers)
// => [("four", 4), ("zero", 0), ("two", 2)]

map

こちらもタプルとしています。

ただ、辞書で返却したい場合が多いと思います。その場合は、次項のreduceのやり方がオススメです。

let doubleTupleNumbers = dictNumbers.map { ($0.0, $0.1 * 2) }
print(doubleTupleNumbers)
// => [("three", 6), ("one", 2), ("nine", 18), ("seven", 14), ("four", 8), ("five", 10), ("zero", 0), ("six", 12), ("eight", 16), ("two", 4)]

reduce

let doubleDictNumbers = dictNumbers.reduce([String: Int]()) { var varDict = $0; varDict[$1.0] = $1.1 * 2; return varDict}
print(doubleDictNumbers)
// => ["three": 6, "one": 2, "nine": 18, "seven": 14, "four": 8, "five": 10, "zero": 0, "six": 12, "eight": 16, "two": 4]

上記で、注意点としては、一度$0varDict変数に代入しているところです。これは、$0イミュータブルな変数だからです。

そのため、下記ではエラーとなります。

let doubleDictNumbers = dictNumbers.reduce([String: Int]()) { $0[$1.0] = $1.1 * 2; return $0}
// =>Cannot assign through subscript: '$0' is immutable

さいごに

いかがでしたか?

Ruby on Railsではおなじみのメソッドですが、少しSwiftならではの制約があります。

ただ、とても可読性が高く、便利なメソッドではないでしょうか?

naoki85

シェア
執筆者:
naoki85
タグ: Swift

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

2週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前