スイフト勉強_ データタイプ 深化 （コレクション型）

前回はデータタイプ安心，タイプ別称，チュープルについて調べた。

今日はそれに続いて、コレクション型について調べてみようと思う。

#コレクション型(Collection Type)
swiftでは、チュープルの他にも多くのデータをまとめて保存·管理できるように、ケレクションタイプを提供している。
コレクションタイプには配列(Array)、ディクショナリー(Dictionary)、セット(Set)などがある。
まずはコレクションの代表的な3タイプについて見てみよう。

>##1.配列（Array）
>>配列は同じタイプのデータを一列に並べた後、順番に保存する形のコレクションで、それぞれ違う位置に同じ値を保存することができる。 順番に保存されるという点と、同一の値を複数回保存できるという特徴がある。
配列タイプを宣言する方法は様々である。
一般的に変数を宣言する方式のように、var と let を使って宣言すればよい。
Arrayというキーワードと、配列中に保存するタイプを組み合わせて使用することもでき、大括弧を使用して配列タイプであることを表記することもできる。 空の配列も生成できる。

```swift
var name1: Array<String> = ["abc","def","ghi"]
var name2: [String] = ["jkl", "mno"]

var name3: Array<String> = Array<String>()
var name4: [String] = [String]()
var name5: [String] = []

name3.isEmpty // true
name4.isEmpty // true
name5.isEmpty // true

name2.count //2
name1.count //3
```
>>配列の各要素はインデックス番号からアクセスできる。
上述のように配列の場合は順序どおりに保存するものであるため、当該順番に存在する値を呼ぶか、交換することが可能である。 ここで重要なことは、始める番号は0から始めるという点である。
次のコードを見て説明を続けたい。

```swift
print(name2[0]) // jkl
name2[1] = "pqr" // ["jkl", "pqr"]
name2[2] = "stu" // error! 

name2.append("stu") //name2配列の最後に追加　["jkl", "pqr", "stu"]
name2.append(contentsOf: ["vwx", "yz"]) // ["jkl", "pqr", "stu", "vwx", "yz"]
name2.insert("mno", at: 1) // ["jkl", "mno", "pqr", "stu", "vwx", "yz"]
// name2.insert(contentsOf: )も可能

name2[2] // pqr
name2.index(of:"pqr") // 2
name2.index(of: "pqrz") // nil
name2.first // jkl
name2.last // yz

let first = name2.removeFirst() //一番目を削除して、返上
let last = name2.removeLast() // 最後のものを削除して、返上
let num2 = name2.remove(at: 2) //　該当インデックスの要素を削除して返却·範囲を外れた場合、エラー
first // jkl
last // yz
num2 //stu
name2 // ["mno", "pqr", "vwx"]
```
>##2.ディクショナリー（Dictionary）

>>ディクショナリーはそれぞれの要素が順番に身長と値段のペアで構成されるコレクションタイプだ。
したがって、保存される際に常に鍵と値がペアを保持するため、同一の鍵を使うことができない。

```swift
var dic1 : Dictionary<String, Int> = Dictionary<String,Int>()
var dic2 : [String : Int] = [String : Int]()
var dic3 : [String : Int] = [:]
var dic4 : [String : Int] = ["a" :1, "b" : 2, "c" : 3]
var dic5 = [1:"a", 2:"b", 3:"c"]

dic1.isEmpty // true
dic4.count // 3
```
>>Dictionary の値にアクセスするためには鍵を使わなければならない。

```swift
dic4["a"] // 1
dic4["d"] // nil
dic4["e"] = 5 //add success
dic4["f"] = 6 

dic4.removeValue(forKey: "f") //delete f, f value
dic4["f", default: 0] // 0

for (key,value) in dic4{
    print("\(key):\(value)") // a:1 c:3 e:5 b:2 // 順序がない。
}
let order1 = dic4.sorted(by: <)
print(order1) // [("a", 1), ("b", 2), ("c", 3), ("e", 5)]
let order2 = dic4.keys.sorted(by: <)
print(order2) // ["a", "b", "c", "e"]
```

>##3.セット（Set）
>>セットは、同タイプのデータを順番なく一つにまとめて保存する形のコレクションタイプだ。
セット内の値はすべて唯一の値、重複する値が存在しない。 それで、順序が重要でなかったり、各要素が唯一の値でなければならない場合に使用する。

```swift
var set1 : Set<String> = Set<String>()
var set2 : Set<String> = []
var set3 : Set<String> = ["a", "b", "c", "c"]

var set4 = [1,2,3] //タイプ推論を使うと配列と認識してしまう。

set3.isEmpty // false
set3.count // 3 , 重複する値は一つだけ保存される。

set3.insert("d")
set3.count // 4

set3.remove("b")// return b
set3.remove("f") // nil
```
>>Set は内部の値がすべて唯一であることを保障するため、集合関係を表現するときに有用に使える。
そして、sorted 関数を活用して整列された配列を返すこともできる。

```swift
let eng: Set<String> = ["a", "A", "b", "B"]
let eng2: Set<String> = ["A", "B", "C", "D"]

let intersect: Set<String> = eng.intersection(eng2)  // ["A","B"]
let symmetric: Set<String> = eng.symmetricDifference(eng2) // ["a","b","C","D"]
let unionSet: Set<String> = eng.union(eng2) // ["a","A","b","B","C","D"]
let substract: Set<String> = eng.substracting(eng2) // ["a","b"]

unionSet.sorted() // ["A","a","B","b","C","D"]
/* その他の集合関連のBool結果を示す関数
A.isDisjoint(with: B) // AとBの積集合が存在しない場合、True
A.isSubset(of:B) // AがBの部分集合の場合True
A.isSuperset(of:B) // AがBの全体集合の場合、True
*/
```

次は最後に列挙形について見ていくことにする。