概要
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始まりで、負の値を受け付けません。範囲外アクセスは実行時エラーになるため、indicesやlastなどの安全な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分の領域を事前確保