Swift 14ArrayとDictionary Collectionで作業する

arrayとdictionaryは　他の`Object:`の集合です。
# 十四・壱　Collectionについて
Swiftでcollectionは`mutable`と`immutable`があります。
後者の`{Instance{}}`で属し物は、`Object:`が`{init{}}`された後には変更できません。これを作りたい場合にはcollectionを生成する時で`let 　　`で割り当てます。反面、 `var  　  `で割り当てれば`mutable`になります。
# 十四・弍　Array 
## 弍・甲　Array Initialize
arrayは一つの順序がある`Collection`で複数の値を入るために特別に設計されたデータターフです。例えば、String `var    `を゛保存するために`Array[]`を生成できます。Swiftでは一つの`Array[]`では同じターフの `var   　 `だけ保存できます。でも`TypeAnnotation`を使って具体的に指定することもできるし、`TypeInferece`を使って`Compiler`が識別させることもできる。
次の`Syntax`を利用すると`Array[]`を生成する時値を持つように`Initialize`できます。
```swift
var 変数名:[ターフ] = [値一、値二、値三、、、、、]
var treeArray = ["pine","oak","yew"]
let treeArray = ["pine","oak","yew"]
```
その`Instance`でSwift Compilerはtype inferenceを通じてStringターフを持っていると判断して、アフリのコードどこでも他のターフの `var    `が追加されない様に阻止します。もちろん`:TypeAnnotation`を使って宣言することもできます。
```swift
var treeArray: [String] = ["pine","Oak","Yew"]
```
また、必ず`Array[]`を生成する時には値を`allow`わけにはありません。
```swift
var priceArray　= [Float]()
```
他の有用な`Init`技術は`Array[]`の各項目ごとに指定された`default`値で事前設定でこれが特定な大きさで`Init`する事にできます。
```swift
var nameArray = [String](repeating: "My String", count:10)
```
前のコードを`Compile`して実行すると、My Stinrgという文字列で`Array[]`の各項目で`Init`されて10個の項目を持つ配列が生成されます。
最後で、既存の`Array[]`二つを合わせて新しい`Array[]`を生成することもできます。
## 弍・乙　`Array[]`で作業する
Swiftにはコード内で配列をの項目を持って操作できる様に提供された`{method()}`と `{Property = }`がたくさんあります。
### count, isEmpty
![Screenshot 2023-10-23 at 4.50.47 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/e43e3c61-6f71-c882-af5d-2b9cb5e3e23d.png)
![Screenshot 2023-10-23 at 4.52.52 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/9532c1f0-ec45-c90d-68c9-0e7fbdd8f0e2.png)

### index 「`Array`の項目に接近する」
> ? index: an alphabetical list of names, subjects, etc., 
~‘towards’ + a second element related to dicere ‘say’ or dicare ‘make known’; compare with indicate. The original sense ‘index finger’ (with which one points), came to mean ‘pointer’ (late 16th century)

indexと言う技術を利用して、`Array[]`のindex「最初の項目は0です」の項目を`<<reference<<`して特定の項目に接近すると修正可能です。
![Screenshot 2023-10-23 at 5.16.29 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/3097a680-652e-16c3-be78-626a1f2a97cb.png)
### .shuffled() . randomElement()
![Screenshot 2023-10-23 at 5.20.16 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/b3bdf690-6688-5cf4-f0b0-6abea0baae56.png)
### append　+=
`Array[]`の項目は `{appendMethod()}`他には、+と+=れんさ演算子を使って配列で追加されることもできます。
![Screenshot 2023-10-23 at 5.35.03 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/6de8bfdf-15cb-3123-a635-e298db69468b.png)
### insert(at:) remove(at:) removeLast()
`Array[]`で`insert(at:)`を呼び出せて特定のindex位置で入れる事ができます。この`method()`は既存の全ての項目を保護するので、新しくで入れた項目を配列内で置くため新しい項目がinsertされるindexの位置を含めて**既存のindexは右で一マスずつ移動することになります。**
でも、(at:)を使って特定の位置からinsertすることもできます。
```swift
var treeArray = ["Pine", "Oak", "Yew"]
treeArray.insert("maple", at: 2)
treeArray.removeLast()
```
removeLast()を使ってarrayの最後のindexを消すこともできます。

### array反復する
一番安い方法はfor~in反復文を使うことです。
![Screenshot 2023-10-23 at 11.51.30 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/14ddf800-6ed8-fc98-c9a2-be4c9ca30f65.png)
forEach()`{method()}`を呼び出して、同一な結果を取る事ができます。![Screenshot 2023-10-23 at 11.56.17 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/3e13c918-d35e-d6fd-36ee-b851a248c0b2.png)

各`Array[]`の`index`について実行作業が`{Closure()}`表現式で宣言されるせいで次のように略式引数名を活用するようにする事ができます。
![Screenshot 2023-10-24 at 12.00.31 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/3a2c0e6d-b1ac-9382-73df-ae85778f021a.png)
## 弍・丙　ターフが混雑された`Array[]`生成する
ターフが混雑された`Array[]`は異なる `ClassType`の項目を入れられる。SwiftのAnyをつかってそんなことができます。
```swift
let mixArray: [Any] = ["A String", 432, 34.989]
```
でも、これをつかうればコードに使用するために正しいタイプへの型変換を直接行わなければならない場合が発生します。もし間違いターフで刑変換をする場合、`Compile　Error`発生ないですけど`Runtime`でランタイムで問題が発生はずです。
```swift
let mixedArray: [Any] = [1,2,45,"Hello"]
```
次の様に`Array[]`を`init`する後、`Array`の`Int Argument`で10を
掛ける反復文です
だが、このコードは　AnyとInt ターフは演算できないとエラーが出て、この問題を解決するには`Array[]`の`index`の`Argument`を`IntType`で`downCasting`しなければならないです。
```swift
for object in mixedArray{
    print(object as! Int * 10)
}
```
でもこのコードは実行されているように見えても、配列の最後のString`Argument`でエラーが発生します。
![Screenshot 2023-10-24 at 11.10.25 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/fbc6afa0-3b78-bce5-0140-d8644acfce35.png)
従って、`Array[]`である格項目の特定ターフを識別できるように修正するべきです。
# 十四・参　Dictionary
## 参・甲　Dictionaryについて
これは　key - Value で対の形でデータを保存して管理させる様にします。
`Dictionary`は`Array[]`と同じ目的を実行するんだけど、此れは保存された各項目の連関される `var    `の`<<reference<<`して接近される為に使用される唯一のkeyと接続されている点が違います。
現在はString, Int, Double, Bool `DataType`だけSwift`Dictionary`で　Key として使用できます。
## 参・乙　`Dictionary` `init`
`Dictionary`は　順序がない単一`Collection`で複数の値を受け取るために設計された特別なデータです。
各項目はkeyとvalueで構成されます。
keyの`DataType`の `var    `項目は`:TypeAnnotation`を使って個体的に指定されるとか`TypeInference`を通じて`Compiler`が識別できる様にします。
新しい`Dictionary`は次の`Syntax`を使って生成するときに `var    `の`Collection`で`init`する事ができます。
```swift
var 変数名: [キーターフ:値ターフ] = [きー1:値1, キー2:値2 ...]
```
```swift
var bookDict: [String: String] =
["100-432112": "Winde in the Willows",
 "200-532874":"tale of two Cities",
 "202-546549":"sense and Sensibility"]
```
*[String: String]を使ないても*この`Instance`は`TypeInference`を通じて他のターフのキーとか値が入れない様にします。
```swift
var 変数名: [キーターフ:値ターフ]()
var myDictionary = [Int: String]()
```
その様に空白の`Dictionary`を生成することもできます。
## 参・丙　Sequense基盤の`Dictionary` `init`
`Dictionary`はキーと値を表わす`sequence`を使って`init`されることもできます。
```swift
let keys = ["100-432112","200-532874","202-546549"]
let values = ["Wind in the Wilows","tale of two Cities","sense and Sensibility"]
let bookDict = Dictionary(uniqueKeysWithValues: zip(keys,values))
```
キーと値をzip()で伝達しました。こと方法はキーと値をフログラミーぐ的に生成される様にくれます。
```swift
let keys = ["100-432112","200-532874","202-546549"]
let bookDict = Dictionary(uniqueKeysWithValues: zip(1...,values))
```
事前定義されたキーの`Array[]`を利用することはなく、一から始める数字をキーで指定する。
```swift
var bookDict = [1:"Wind in the Wilows",
                2:"tale of two Cities",
                3:"sense and Sensibility"]
```
此れは、前のコードを一つだけで定義することになります。

## 参・丁　Dictionary 項目に接近と更新する
特定値は該当キーを`<<reference<<`為にキー添え字syntaxを用いると修正する事ができます。
![Screenshot 2023-10-24 at 2.42.54 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/8a3a5ec7-b1ea-bab4-47be-d32731593199.png)
これと同じ様に`Dictionary`項目に接近するときにも*指定されたキーで該当する値が居ない*場合には使用されるdefaultValueを宣言することもできます。
```swift
print(bookDict["999-546547", default: "Book not found"])
```
作った`Dict[k,v]`には指定されたキーについた項目がなくて、Book not foundが出力するはずです。
同じ様に特定キー接続された値を更新することもできます。
```swift
bookDict["200-5432874"] = "Sense and Sensibility"
```
### .updateValue() (method)
変更される値と該当キーを伝達して*upadateValue(forKey:)`method`を呼び出しても*同じ動作をします。
```swift
bookDict.updateValue("The Ruins", forKey: "200-532874")
```

### .count (property)
![Screenshot 2023-10-24 at 3.25.51 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/4503a642-cf7a-df59-4632-7be06628a36c.png)

## 参・戊　`Dictionary` `index` 追加と削除する 
![Screenshot 2023-10-24 at 3.31.09 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/54c998e7-ce5e-f7d9-ebfd-0bf7c84558eb.png)
任意のキーと値のぺーあを`Dict[k,v]`で削除するときには該当の`index`でnil値を`assign`するとか`Dictionary` `Instance`のremoveValue(foreKey:)`method`を呼び出せばいいです。
```swift
bookDict["300-898871"] = nil
bookDict.removeValue(forKey: "300-898871")
```
## 参・己　`Dictionary`の反復
for-in 反復文を使用すると`Dictionary`の項目を反復できます。
![Screenshot 2023-10-24 at 4.09.53 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/4eafcfb5-449c-3da4-a30f-f842216defc9.png)
# 要約
Swiftの`Collection`は`Dictionary`または`Array[]`の形をとります。両方とも一つの`Object:`に複数の項目を受け入れる方法を提供して、配列で含まれた`index`の位置で該当する`var    `で`index`で接近する。`Dictionary`はキーと`value = `で保存する方法を提供して、キーは`value = `に接近するで使用される。
此れたちはfor~inで反復できます。