# 配列 | Array型

配列とは、同じ型の値を順番に並べたコレクションです。同じ値が異なる位置に複数回現れることもあります。

# 配列の宣言方法

Swiftの配列は基本的に次のフォーマットで書くことができます。[] の中にカンマ区切りで値を列挙して定義します。

let array: Array<Element> = ["値", "値"]

次の例では、Int型を含む配列を生成しています。

let a: Array<Int> = [1,2,3]

# シンタックスシュガー

Array<Element> の型アノテーションは、シンタックシュガーを使って、[値の型] のフォーマットで書くことができます。

let a: [Int] = [1,2,3]

一般的に、シンタックスシュガーが使われることが多いので積極的に使いましょう。

# 型推論

Swiftは、配列に含む要素から型を推論できるので、宣言時には型を省略して書くことができます。前節の例を型アノテーションを省略して書くと、次のようになります。

let a = [1,2,3]

しかし、空の配列を定義する場合は、値の型推論ができないため、明示的に型を指定する必要があります。

let a: [Int] = []

型を指定しないと、コンパイラはエラーを出力します。

let a = []

/* 実行結果 */
// error: empty collection literal requires an explicit type
// let a = []

# 空の配列

空の配列は、イニシャライザを使って次のように書くこともできます。

let a = [Int]()

// let a: [Int] = [] と同じ

# 複数の型

また、複数の型の要素がある場合は、型の推論によって型を一つにできないため、明示的にAny型を指定する必要があります。

let a: [Any] = [100, "Hello", 0.5]

# 配列要素へのアクセス

配列要素へのアクセスは、インデックスを指定して要素を取得することができます。

配列のあとに、[インデックス] を添えてアクセスします。

let a = ["Cat", "Dog", "Rabbit"]

a[0] // Cat
a[1] // Dog
a[2] // Rabbit

存在しない要素へアクセスすると、実行時エラーになります。

var a = ["Cat", "Dog", "Rabbit"]

a[3] // 存在しない

/* 実行結果 */
// Fatal error: Index out of range
// Current stack trace:

インデックスを指定する以外にも、firstlast などでアクセスすることもできます。

let a = ["Cat", "Dog", "Rabbit"]

a.first     // Optional("Cat")
a.last      // Optional("Rabbit")

firstlast などでアクセスした際は、返り値はOptional型になります。

# 配列要素の更新

配列の要素を更新するには、更新したい要素のインデックスを指定して、値を代入すると更新することができます。

var a = ["Cat", "Dog", "Rabbit"]

// 更新したい要素のインデックスを指定する
a[0] = "Hamster"

a // ["Hamster", "Dog", "Rabbit"]

let で宣言すると代入が不可になるのでコンパイラはエラーを出力します。

// let で宣言
let a = ["Cat", "Dog", "Rabbit"]

a[0] = "Hamster"

/* 実行結果 */
// error: cannot assign through subscript: 'a' is a 'let' constant
// a[0] = "Hamster "
// note: change 'let' to 'var' to make it mutable
// let a = ["Cat", "Dog", "Rabbit"]

# 配列要素の追加

配列の要素を追加するには、以下の方法があります。

# append

appendは、配列の末尾に要素を追加することができます。

var a = ["Cat", "Dog", "Rabbit"]

// 末尾に、Hamster を追加する
a.append("Hamster")

a   // ["Cat", "Dog", "Rabbit", "Hamster"]

配列に別の配列の要素を入れたい場合は、contentsOf: を使用することができます。

var a = ["Cat", "Dog", "Rabbit"]
var b = ["Hamster"]

a.append(contentsOf: b)

a   // ["Cat", "Dog", "Rabbit", "Hamster"]

# insert

insertは、任意の位置に要素を追加することができます。

var a = ["Cat", "Dog", "Rabbit"]

// 先頭に、Hamster を追加する
a.insert("Hamster", at: 0)

a // ["Hamster", "Cat", "Dog", "Rabbit"]

# +演算子で結合

+演算子は、2つの配列の要素を結合することができます。

let a = [1,2,3]
let b = [4,5,6]

// +演算子で結合
let c = a + b

c // [1, 2, 3, 4, 5, 6]

同じ値があったとしてもそのまま結合されます。

let a = [1,2,3]
let b = [3,4,5,6]

let c = a + b

c // [1, 2, 3, 3, 4, 5, 6]

# 配列要素の削除

配列の要素を削除するには、以下の方法があります。

# remove

removeは、インデックスを指定して要素を削除することができます。

var a = [1,2,3]

// 削除したい要素のインデックスを指定する
a.remove(at: 0)

a // [2, 3]

# removeFirst

removeFirstは、配列の先頭の要素を削除することができます。

var a = [1,2,3]

a.removeFirst()

a // [2, 3]

# removeLast

removeLastは、配列の末尾の要素を削除することができます。

var a = [1,2,3]

a.removeLast()

a // [1, 2]

# removeAll

removeAllは、配列の全ての要素を削除することができます。実行後は、空の配列になります。

var a = [1,2,3]

a.removeAll()

a // []

# その他の配列の操作

# 配列の要素数を調べる

配列の要素数を調べるには、count を使うことができます。

let a = [1,2,3]

a.count // 3

# 配列が空か調べる

配列が空かどうがを調べるには、isEmpty を使うことができます。空の場合は、true を返し、要素がある場合は false を返します。

let a: [Int] = []

a.isEmpty // true

let b = [1,2,3]

b.isEmpty // false