Swift 12 structとenum

一見するとstructとclass**似ているように見えます**が、どの様なものを使うべきかを決定する時には、理解しなければならない**違う点が**あります。
今度の章には、structをどうやって宣言すると使用するかを説明して、stuctとclassの違う点について調べます。また、value typeとreference typeに関する概念を説明します。

# 十二・壱　`struct{}`と `Class{}`は似ている
structも `Class{}`みたいな`Object`様な機能を使えます。
例え、機能を再利用する`Object`でカプスルか方法を提供し、
`Struct`宣言は `Class{}`と似ていますが、使う`keyword`が違います。
![Screenshot 2023-10-19 at 2.21.08 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/8f64126c-c5c8-6243-c18e-744e2186837c.png)
`let = Instance(:)`生成も同じです。意外にも拡張や `: Protocol`採択や`{init{}}`する事ができます。まず、**valueTypeとrefereceType**についてしてみよう。

# 十二・弐 Sturct

## 弐・甲　 `Class{}`と`Struct{}`の`Instance`Value Type
`Struct{}`の`Instance`は`ValueType`ですけど、
`Class{}`の`Instance`は`<<Reference<<`Type`です。

## 弐・乙　`StructInstance`の`ValueType`
`Struct　Instance`がコピーされたり、`Method()`に伝達する時に、`Instance`の実際コピが生成されながら原本の`Object`が持っているデータをこぴして取ります。つまり、copy本を別個の自身のデータを持つといす事です
実際に実行中アフリの`Struct Instance`に対するCopyが複数存在することができ、それぞれのCopyは自身のデータを持って一つの`Instance`を変更しても他の`Instance`には影響与えない。
## 弐・丙　`StructInstance`の`ValueType`
これと逆に、`Instance`が`copy`されるとか`Argument`で伝達されると該当`Class Instance(){ }`があるメモリの位置に対する`<<Reference<<`が作られるとか伝達されます。
`<<Reference<<`を変更すれば原本`Instance`にもをなじ`Task`が実行されます。
つまり、ただ一つの`Class Instance(){ }`が存在して、その`Instance`を指す色んな`<<Reference<<`が存在する事です。
`<<Reference<<`の一つを使えて`InstanceData`を変更すると全てのデータが変更されます。
## 弐・丁　例題

![Screenshot 2023-10-19 at 4.52.40 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/711965d9-cb84-082a-b9c8-e7cb7c40eef5.png)
![Screenshot 2023-10-19 at 4.57.17 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/e171313c-9de9-11d7-1d5f-3f9c7637b7dc.png)

## 弐・戊　 `Class{}`はできますけど、`Struct{}`ができない事と
`Struct{}`は`subClass{}`とか`inherit`をサポートしません
言い直して、他の`Struct{}`で`inherit`できません。
他にも、`{deinit{}}`を含まる事ができません。
最後に、`Run Time`で　 `Class Instance(){ }`の`Type`を識別することができますが `Struct{}`そうではありません。

## 弐・己　`Struct{}`と `Class{}`はいつ使いますか
一般的に`Struct{}`が `Class{}`より効率的し、MultiThreadコードを使用するともっと安定的で、できれば`Struct`使用を進めます。
だが`↓inherit`が必要とか、テータがカプスル化された一つの`Instance`が必要な時には `Class`を使用するべきです。
最後に、`Instance`が消滅するときリソースを確保する為の `Class`を使う。

# 十二・参　Enum
## 参・甲　enumについて
>? enumerate : mention (a number of things) one by one.
~  Latin enumerat- ‘counted out’, from the verb enumerare,

此れは、事前定義された`value =`の集合で構成された使用者指定データターフを作るのに使用されます。
`Enumeration`は一般的に'`Switch` Syntaxを使用する時にも使います。
```swift
enum Temperature {
    case hot
    case warm
    case cold
}
```
`value`が割り当てない場合いそのタープの`enum{}`は基本的に先に定義された状態の一つを参照するために使用されます。

```swift
func displayTempInfo(temp: Temperature) {
    switch temp {
        case .hot:
        print("It is hot")
        case .warm:
        print("It is warm")
        case .cold:
        print("It is cold")
    }
}
```
enumには有効するmemberの最終集合があるので`SwitchSyntax`に`deault`を含める必要がないことです。
`SwitchSyntax`をとして有効できない `enum{}case`を伝達すれば`RunTimeError`が起こる可能性がある前に`Compiler`によって捕捉される。

`enum{}`をテストすると、次の3つが可能な状態中の1つが選ばれたTemperatrueの`enum{}`の`Instance`をdisplayTempInfo`func(){     }`に伝達するべきだ
```swift
Temperature.hot // instance
Temperature.warm// instance
Temperature.cold// instance

displayTempInfo(temp: Temperature.warm) //run 
>> It is warm
```
`enum{}`内の個別のcaseには接続された`value = `があるかも知れない
例え、coldの`enum{}Case`が tempと接続されなければappが寒さと凍結を区別できるとしましょう。此れは次の様に`enum{}`宣言内で定義できます。
```swift
enum Temperature {
    case hot
    case warm
    case cold(centigrade: Int)
}
```
これを通じて、`Switch` `Syntax`は次の様に`cold`caseのTemperatureも確認できます。
```swift
func displayTempInfo(temp: Temperature) {
    switch temp {
        case .hot:
        print("It is hot")
        case .warm:
        print("It is warm")
        case .cold(let centigrade) where centigrade <= 0:
        print("Ice warning: \(centigrade) degrees.")
    case .cold:
        print("It is cold but not freezing")
    }
}

displayTempInfo(temp: Temperature.cold(centigrade: -10))
>> Ice warning: -10 degrees 
```
# 要約
Swift `Struct{}`と `Class{}`は`{Property = }`を定義して、`value`を保存します。`{method()}`を定義できる`(Object: )`生成メカニズムを提供します。二つのメカニズムが似たいる様ですけど、`StructInstance`と`ClassInstance`が`copy`されるとか伝達する時には大事な違う点を見せます。
`Class`は`<<reference<<` `:Type` `:Object`で具別されるですけど、
`Struct`は`value = ` `:Type`で具別されます。
`struct{Instance{}}`が`copy`されるとか`{method()}`で伝達されば元々の `Class{Instance{}}`を指す`<<reference<<`ができます。
 `Class{}`だけが持つ固有の機能はinheritとdeinitを支援することで、Runtimeで `Class{}`Typeを識別できることです。
`enum{}`は前に定義された`case:` `value`集合で構成された使用者指定タイプを作るために使用されて、特に`Switch Syntax`内で`Case`を識別する為に使用されます。