SwiftにおけるArray型の実践的な活用法

概要

Swiftの標準ライブラリに含まれるArray<Element>は、順序を保持した要素の集まりを扱うための構造体です。値型であるため代入や引数渡しの際にコピーが発生することに注意しつつ、効率的な操作を実現するための豊富なAPIが用意されています。

初期化パターン

// 空の配列
var primes: [Int] = []

// リテラルから生成
let fibonacci = [0, 1, 1, 2, 3, 5]

// 要素数と初期値を指定
let zeros = Array(repeating: 0.0, count: 10)

// 既存シーケンスから変換
let chars = Array("Swift")

要素へのアクセス

添字は0始まりで、負の値を受け付けません。範囲外アクセスは実行時エラーになるため、indiceslastなどの安全なAPIを活用しましょう。

let colors = ["red", "green", "blue"]
let first = colors.first           // Optional("red")
let lastIndex = colors.endIndex - 1
let last = colors[lastIndex]       // "blue"

変更操作

var scores = [85, 92, 78]

// 末尾に追加
scores.append(90)

// 任意位置に挿入
scores.insert(88, at: 1)

// 範囲置換
scores.replaceSubrange(1...2, with: [95, 80])

// 条件に一致する要素を削除
scores.removeAll { $0 < 80 }

列挙と変換

let words = ["apple", "banana", "cherry"]

// 添字付きループ
for (index, word) in words.enumerated() {
    print("\(index): \(word)")
}

// マッピング
let uppercased = words.map { $0.uppercased() }

// フィルタ+マップを一度に
let lengths = words.compactMap { $0.count > 5 ? $0.count : nil }

ソートとシャッフル

var numbers = [4, 2, 7, 1, 3]

// 破壊的ソート
numbers.sort()

// 非破壊ソート
let descending = numbers.sorted(by: >)

// ランダムシャッフル
numbers.shuffle()
let shuffled = numbers.shuffled()

重複除去と分割

let raw = [1, 2, 2, 3, 3, 3]

// Setを使った簡易重複除去(順序は保証されない)
let unique = Array(Set(raw))

// 順序を保持した重複除去
let orderedUnique = raw.reduce(into: [Int]()) { result, value in
    if !result.contains(value) { result.append(value) }
}

// 条件で分割
let evensAndOdds = Dictionary(grouping: raw) { $0 % 2 == 0 }

パフォーマンスに関する注意点

値型であるArrayは、書き換えが発生するまでコピーを避ける「コピーオンライト」最適化が施されています。大量データを扱う場合は、予めreserveCapacity(_:)でバッファを確保しておくことで再確保のコストを削減できます。

var buffer: [UInt8] = []
buffer.reserveCapacity(1024 * 1024) // 1MB分の領域を事前確保

タグ: Swift Array value-type copy-on-write standard-library

8月14日 00:39 投稿