Swiftの構造体について。

# はじめに
Swiftで利用される事の多い構造体についてプログラミング初心者の僕が、備忘録的に書いていきます。

## 構造体とは？
構造体とは、カテゴリが似ているデータを１つにグルーピング（まとめて）管理・利用するための大きな箱みたいな物だと思っています。
カテゴリが似ているというのは例えば、名前と年齢を管理して一人の情報をまとめたり、都道府県の名前や都市名をだったりといろいろあると思います。
これ同じような情報が入ってるなぁと思う変数や関数があればそれを大きな箱に入れて管理・利用する、それが構造体なんだと考えると分かりやすいのではと思います。
#構造体の定義、プロパティ、メソッド
構造体は変数や定数、関数などを１つの型名（構造体名）でまとめることができます。
⬇️構造体の定義
struct 型名（構造体名）　{
 変数（プロパティ）
 定数（プロパティ）
 関数（メソッド）
}
構造体の中で使われる変数・定数をプロパティと呼びます。
プロパティ（property)は物体の特性・特質を意味する言葉です。
関数のことをメソッドと呼びます。
メソッド（method)は方法、方式を意味する言葉です。
ここら辺は言い方の問題なので自然に慣れてくるので気にしなくても大丈夫だと思います。

⬇️構造体の定義と使い方の例
```
名前と年齢を管理する構造体
Struct Person { 
プロパティ
var firstName: String
var lastName: String 
var age: Int
}

名前と年齢の設定
var myPerson = Person(firstName:"山田",lastName:"太郎",age:22)
print("名前：\(myPerson.firstName) \(myPerson.lastName)") // 名前：山田太郎　とコンソールに出力されます。
print("年齢：\(myPerosn.age)歳")```//年齢：２２歳　とコンソールに出力されます。

文字列（""）の中に　\（）　を入れることで、文字列の中に変数を埋め込むことができます。
今回だと\（myPerson.firstName）と\（myPerson.lastName）と\（myPerosn.age）が変数の埋め込みになっています。
```

## 構造体のインスタンスとイニシャライザ
構造体に置いて1番の難所はここかなと感じているところになります。
構造体のインスタンスとはプログラムで構造体を使える状態にすることをいいます。
構造体を定義して変数、定数、関数をまとめたとしてもそれはまとまっているだけであってプログラムで使える状態になっているわけではありません。
構造体を使える = 値を保存できる状態にすることをインスタンス生成（インスタンス化）といいます。
その構造体のインスタンスを生成するときに、初期化（使える状態にすること）のための手続きのことをイニシャライザ（initializer)と言います。
インスタンスとイニシャライザは車や建物の設計図で例えられることが多いのですが、設計図にどんな機能やデザインにするか紙にかいてまとめていくのが構造体の定義をするところに当たり、設計図にまとめた機能やデザインを元に実際の車や建物を作っていく作業のことをインスタンス生成と言います。
ここら辺が最初は頭の中が？？？となりますが、1、2ヶ月構造体を使っていくと、なるほど、そういうことなのね！と知識が繋がって分かるようになってくるので大丈夫です（僕もそんな感じなので）

そして、Swiftでは構造体を定義するときに初期値（変数や定数に値を入れること）を事前に設定するか、インスタンス化（プログラムで構造体を使える状態にすること）するときに初期値を設定しないといけません。
初期値を設定せずにprint文で出力したりしようとするとエラーになります。

⬇️構造体のインスタンスとイニシャライザの例
```
名前と年齢を管理する構造体
Struct Person1 {
//プロパティ
var firstName: String　= "山田"　
var lastName: String = "太郎"
var age: Int　＝　23
}
// Person1構造体のインスタンス生成（インスタンス化）をしています。
　var myPerson1 = Person1()
この例では構造体の定義をするときにプロパティに初期値を設定していますので、Person1構造体のインスタンス化すると構造体を使うことができます。

名前と年齢を管理する構造体
Struct Perso2 {
プロパティ
var firstName: String 
var lastName: String 
var age: Int　
}
//構造体のインスタンス生成と初期値の設定を同時に行なっています。
var myPerson2 = Person2(firstName: "山田", lastName: "太郎", age: 23)
この例では構造体の定義をするときにプロパティに初期値を設定していないので、Person2構造体のインスタンスを生成するときに初期値を設定しないと構造体を使うことができません。
```
## まとめ
構造体はSwiftで非常によく使われるものなので、理解しなければいけませんが、すぐには理解できなくても使っているうちに段々と分かってくるので、焦らなくても大丈夫です。
僕自身はCodeCandyというiOSアプリ開発特化のオンラインスクールでSwiftUIをメインにを学習していますが、他の方々も難しいと感じる部分は同じみたいなので、学習しているというよりもゲームの敵を倒す感覚でやっていきたいと思っています。

Qiitaに記事を書くのは2回目ですが、やはりアウトプットする時に知識は身につくので、今後も自分のため、そしてこれからプログラミングの学習を始める方々のお力になればと思いながら書いていきたいと思います。
アウトプットをする時にのコツとして一つ良いなと思うのは、
「プログラミングを学習した事のない友人や知り合いに、専門用語を使わずに分かりやすく説明する」という方法が良いなと感じてます。
専門用語を使わずに説明した場合は、今自分が持っている知識を噛み砕いて説明しなければいけないので、説明している間に自分の中でも理解がかなり進むと感じているのでおすすめです。
また、下記に参考書籍を載せておきますので、ぜひ一度見ていただきたいと思います。

今後は、構造体と似て非なる仕組みのクラス(class)についても別の記事でまとめていこうと思います。
最後までご覧いただきありがとうございました。

## 参考書籍
- [SwiftUI対応 たった2日でマスターできるiPhoneアプリ開発集中講座 Xcode 12/iOS 14対応](https://www.amazon.co.jp/SwiftUI%E5%AF%BE%E5%BF%9C-%E3%81%9F%E3%81%A3%E3%81%9F2%E6%97%A5%E3%81%A7%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%A7%E3%81%8D%E3%82%8BiPhone%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E9%9B%86%E4%B8%AD%E8%AC%9B%E5%BA%A7-Xcode-iOS-14%E5%AF%BE%E5%BF%9C/dp/4802612788/ref=monarch_sidesheet)

- [［増補改訂第3版］Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語](https://www.amazon.co.jp/dp/B086VVQ3DJ/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

- [詳解 Swift 第5版 Kindle版](https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-Swift-%E7%AC%AC5%E7%89%88-%E8%8D%BB%E5%8E%9F-%E5%89%9B%E5%BF%97-ebook/dp/B081GK7636/ref=sr_1_21?keywords=swift+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&qid=1656293972&s=digital-text&sprefix=swift+%2Cdigital-text%2C186&sr=1-21)