この記事ではSwift
の基本ある、配列
についての基本事項を解説していきます。
プログラミングが初心者も、他の言語をやっていてSwift
は初心者という人にもわかるように説明していきたいと思います。
サンプルコードも交えながら説明していきますので、Playground
を使って実際に手を動かしながら行えると効率よく学習できるかなと思います。
Contents
Array<Element>型とは
Array<Element>型
は配列を表します。
配列というのは、データの集まりをまとめて格納するデータ構造であるコレクションの1つで、他のコレクションと異なる点は、順序を持つことです。
Swiftで主要なコレクションは配列 (Array)、集合 (Set)、辞書 (Dictionary) の3つがあります。
Array<Element>
のElement
の部分は、実際に使うときには具体的な型で置き換えて、Array<Int>型
やArray<String>型
のようにして使います。
例えばArray<Int>型
であれば、Int型
の要素が集まった配列ということになります。
配列の要素にはどんな型でも取れるので、Element
で仮置きのようにしています。
配列の宣言方法
Array<Element>型
は、以下のようにカンマ区切りで要素を列挙して[]
で囲みます。
let a: Array<Int> =
let b: Array<String> = ["a", "b", "c"]
上記の例では、Array<Int>
やArray<String>
と記述しましたが、[Int]
や[String]
と書くこともできます。
実際に使うときは[Int]
や[String]
というように書くほうが一般的です。
このように、すでに定義されている構文をより簡単に読み書きできるように導入されている構文をシンタックスシュガーといいます。
let a: [Int] =
let b: [String] = ["a", "b", "c"]
2種類の表現が同じ意味を表す表現というのをわかっていないと、見たときに混乱してしまうのでしっかり押さえておきましょう。
型推論
配列の要素が推論可能な場合、型アノテーションを省略することができます。
let a = //[Int]型
let b = ["a", "b", "c"] //[String]型
要素が空の配列は[]
と表します。
要素がからの場合には型アノテーションを付けて、型を明示する必要があります。
let a = [] //コンパイルエラー
let b: [Int] = []
[Any]型
配列の要素の型は、全て同じでないといけないというルールがあります。
let a: [Int] = //コンパイルエラー
もしそのような配列を扱いたい場合はAny型
を使用します。
他のどんな型でもAny型
として扱うことができます。
なので先程の例も、[Any]型
とすればコンパイルエラーにはなりません。
let a: [Any] =
どんな型でもAny型
と扱うことができるのでオールマイティな便利な型と想うかもしれませんが、実際にはなるべく使わないようにしたほうがいいです。
例えば、Int型
であれば四則演算をすることができますが、値が整数だったとしてもAny型
と扱ってしまえば、四則演算ができなくなってしまいます。
let a: Any = 1
let b: Any = 2
a + b //コンパイルエラー
このようにAny型
とすることで型情報が失われて操作の幅が狭くなってしまうので、なるべくAny型
は使わないようにするのが好ましいです。
要素にできる型
前半部分でも説明しましたが、Array<Element>型
のElement
の部分にはどんな型も当てはめることができます。
例えばElement
の部分に[Int]型
を当てはめることで[[Int]]型
を表すことができます。
これはInt型
の配列の配列を表します。
let a: [[Int]] = [, [4, 5, 6]]
このような配列を2次元配列といいます。
同様に、[[[Int]]]型
のようにすることもできます。
配列の操作
ここからはArray<Element>型
の基本的な操作をまとめていきます。
要素へのアクセス方法
Array<Element>型
にアクセスするには[]
とインデックスを表すInt型
の数値を使って以下のように表します。
最初の要素のインデックスは0
から始まることに注意してください。
インデックスは範囲を超えてしまうと実行時エラーになります。
let a: [String] = ["a", "b", "c"]
a[0] //"a"
a //"b"
a //"c"
a //実行時エラー
[インデックス]
の部分をサブスクリプトといいます。
特に、最初の要素と最後の要素にアクセスする場合には、first
やlast
を使うことでアクセスすることができます。
let a = ["a", "b", "c"]
print(a.first) //Optional("a")
print(a.last) //Optional("c")
let b: [Int] = []
print(b.first) //nil
print(b.last) //nil
もし対象の配列の要素がからの場合にはnil
となるので、first
やlast
を使う場合にはオプショナル型
となるので注意が必要です。
オプショナル型に関してはこちらの記事で説明しています。
要素の更新
配列の要素の更新を行いたい場合は、以下のように更新したい要素を指定して、=
で代入する形で書きます。
こちらは変数でないと実行できません。
var a: [String] = ["a", "b", "c"]
a = "bb"
print(a) //["a", "bb", "c"]
let b: [String] = ["a", "b", "c"]
b = "bb" //コンパイルエラー
配列の要素を追加
配列に要素を追加する場合はappend
を使う方法と、+
や+=
を使う方法があります。
こちらも、元の配列を書き換える形になるものは変数でないと使えません。
var a: [String] = ["a", "b", "c"]
a.append("d")
print(a) //["a", "b", "c", "d"]
let b = a + ["e"]
print(b) //["a", "b", "c", "d", "e"]
var c = ["a", "b"]
c += ["c"]
print(c) //["a", "b", "c"]
先程の、append
,+
,+=
は末尾に追加するのに対して、指定した場所に追加するのはinsert
を使います。
var a = ["a", "b", "c"]
a.insert("d", at: 1)
print(a) //["a", "d", "b", "c"]
要素の削除
要素の削除には、
- remove … 指定の要素のインデックスを指定して削除する
- removeFirst … 最初の要素を削除する
- removeLast … 最後の要素を削除する
- removeAll … すべての要素を削除する
などが主にあります。
var a = ["a", "b", "c", "d", "e"]
a.remove(at: 1)
print(a) //["a", "c", "d", "e"]
a.removeFirst()
print(a) //["c", "d", "e"]
a.removeLast()
print(a) //["c", "d"]
a.removeAll()
print(a) //[]
配列の要素数を調べる
配列の要素数を調べる場合はcount
を使います。
let a = ["a", "b", "c"]
a.count //3
配列の要素が空かどうかを調べる
配列が空かどうかはisEmpty
を使います。
let a = ["a", "b", "c"]
a.isEmpty //false
let b: [Int] = []
b.isEmpty //true
配列のそれぞれの要素に対して処理を行う
配列のそれぞれの要素に対して処理を行う場合はfor文
を使うことで可能です。
let strings = ["a", "b", "c"]
for string in strings {
print(string)
}
//実行結果
a
b
c
この記事では詳しく扱いませんが、map
やforEach
を使った配列の処理も使いこなせるようになると便利です。
let numbers =
numbers.forEach { print($0) }
let doubleNumbers = numbers.map { $0 * 2 }
print(doubleNumbers)
//実行結果
0
1
2
まとめ
今回は、Array<Element>
に関してまとめていきました。
Array<Element>
はSwift
の基本事項なのでしっかり押さえておきましょう。
Swift
の入門記事に関してはこちらにまとめていますので参考にしてみてください。