Swiftで学ぶ構造体

#はじめに

学習を進めていく時に、構造体についての理解が非常に浅かったので、備忘録としてまとめていこうと思います。

#構造体とは
構造体は、プロパティやメソッドを定義することによって様々なデータや振る舞いを形成することができる機能です。


#使い方
では、簡単な使い方を説明していきます。
#宣言

```example.swift
struct 構造体名 {

}
```
このような形になります。

実際の使用例では以下のようになります。

```example.swift
struct Snack {
    var SnackName = "potato" //プロパティ
    func PrintSnackName() {  //メソッド
        print(self.SnackName)
    }
}

let SnackOne = Snack()

SnackOne.SnackName//potato

SnackOne.PrintSnackName()//potato
```

このように、一度構造体内で設定したプロパティやメソッドを使うことができます。

#プロパティとメソッドの違い

これは僕だけかもしれませんが、プロパティとメソッドの違いについて詳しく知らなかったのでまとめてみました。

##プロパティ
**プロパティは、構造体の性質や特徴の事です。**
言葉にすると少し難しく感じると思うのでコードを書いてみました。

````class.swift
struct MyInformation {
    var MyName = "naoki" //プロパティ
}
let SnackOne = MyInformation()
print(SnackOne.MyName)//naoki

````
このように、あらかじめプロパティを決める事で、そのプロパティの中身を使い回すことができます。

###二つのプロパティ
**実はプロパティは「ストアプロパティ」と「コンピューテッドプロパティ」の二つに別れます。**

それぞれの特徴を述べていきます。

####ストアプロパティ
**ストアプロパティは、値を保持するためのプロパティです。**

先ほど紹介したプロパティがストアプロパティです。

````example.swift
struct MyInformation {
    var MyName = "naoki" //ストアプロパティ
}

````

####コンピューテッドプロパティ
**コンピューテッドプロパティは、値を計算するためのプロパティです。**

````example.swift
struct Triangle {
    var length = 10 //ストアプロパティ
    var area:Int { //コンピューテッドプロパティ
        let sum = length * length / 2
        return sum
    }
}
let triangle = Triangle()
print(triangle.area) //50
`````

このようにあらかじめ値を計算する働きをしてくれます。

####二つのプロパティの違い
二つのプロパティは以下の２点です。

|  | ストアプロパティ | コンピューテッドプロパティ |
|:-:|:-:|:-:|
| 先頭のキーワード  | var または let  |  varのみ |
| 型の省略  | できる  | できない  |

このような違いがあります。

##メソッド
**メソッドは構造体の中にある、自身のプロパティを操作するための命令文です。**
コードで書くとこんな感じです。

```example.swift
struct MyInformation {
    var MyName = "naoki" //プロパティ
    func greeting() {
        print("私の名前は\(self.MyName)です。")//メソッド
    }
}
let MyFirst = MyInformation()//インスタンスを作る
MyFirst.greeting()//私の名前はnaokiです
```
構造体の中にある「Myname」というプロパティを使って、自分紹介をするメソッドを作りました。
このようにメソッドは、プロパティを使って関数のような働きをする機能になります。

###コンピューテッドプロパティとメソッドの違い

疑問に思った方もいると思いますが、コンピューテッドプロパティとメソッドのちがいは一体なんなのでなのでしょうか？

コードを見ながら考えてみましょう！

````example.swift
struct Triangle {
    var length = 10 //ストアプロパティ
    var OneArea:Int { //コンピューテッドプロパティ
        let sum = length * length / 2
        return sum
    }

    func TwoArea(height: Int) { //メソッド
        let sum = height * height
        print(sum)
    }
}
let triangle = Triangle()
print(triangle.OneArea) //コンピューテッドプロパティ
triangle.TwoArea(height:5) //メソッド
````

以上から２点の違いが見られました。

|  | メソッド | コンピューテッドプロパティ |
|:-:|:-:|:-:|
| 引数  | あり  |  なし |
| 戻り値  | どっちでもいい  | 必ずある  |

このような特徴がありました。

#構造体の使い方
構造体を作ったのはいいのですが、使わないと意味がありません。
しかし、構造体は設計図のような物なので、そこから実物を作らないといけません。

そこで出てくるのが**「インスタンス」**です。

##インスタンスとは
インスタンスは、構造体を元に作られた機能です。
使い方としては、

1.インスタンスを作る
2.インスタンス内のプロパティやメソッドを使う

このような流れになります。

さっき紹介したコードをもう一度見てみましょう。

```example.swift
struct MyInformation {
    var MyName = "naoki" //プロパティ
    func greeting() {
        print("私の名前は\(self.MyName)です。")//メソッド
    }
}

let MyFirst = MyInformation()//インスタンスを作る
MyFirst.greeting()//インスタンス内にあるメソッドを使う
```
このように、構造体を作った後にインスタンスを宣言して、インスタンスにあるプロパティやメソッドを使用していくと言うのが一連の流れになります。

#イニシャライザ
インスタンスを初期化する特殊なメソッドとして**イニシャライザ**が挙げられます。
イニシャライザとはインスタンスを初期化するメソッドで、構造体のセキュリティ(型の整合性)などでよく使われます。

宣言方法と呼び出し方は以下の通りです。

````example.swift
init(ラベル１ 引数名1:型,ラベル2 引数名2:型){ //引数の宣言
    文
}

var 変数名 = 構造体(ラベル1:引数, ラベル2:引数) //呼び出し

````

ラベルは、外から引数を呼ぶ代わりにつけられる名前の事です。

言葉で説明すると難しいので、実際のコードを見てみましょう。

````example.swift
struct Square {  
    var height:Int
    var width:Int
    init(height:Int, width:Int) { //イニシャライザ
        self.height = height
        self.width = width
    }
}

var OneSquare = Square(height: 2, width: 4) //呼び出し
print(OneSquare) //Square(height: 2, width: 4)
````

このように、入ってきた引数を初期化して、ストアプロパティに代入することができます。

#まとめ

長くなりすぎました。。。