Swiftでプロパティの種類を学ぶ

おはようございます。

swift初学者です。

swiftを勉強している時に、プロパティの種類が多すぎて混乱してしましました。

なので本記事では、備忘録としてプロパティの種類を整理すべく、各プロパティの特徴や性質をしていこうと思います。

#そもそもプロパティとは
**プロパティとは、クラスや構造体などに紐付いた値の事を指します。**
構造体でいうと以下の通りです。

````example.swift
struct Person {
    var name:String //プロパティ
    var age:Int  //プロパティ
}

let Myname = Person(name:"naoki",age: 23)

print(Myname.name)
````
このように、クラスや構造体の構成要素になります。

#プロパティの種類
プロパティには主に二つの種類に分けることができます。

**値の保持により分類されるプロパティ**
**定義される対象により分類されるプロパティ**

この二つに分類されます。

#値の保持による分類

値の保持による分類は二つ存在します。

**ストアドプロパティ**
**コンピューテッドプロパティ**

それぞれの特徴を紹介していきます。

##ストアドプロパティ
**ストアドプロパティは値を保持するプロパティになります。**

````example.swift
struct Person {
    var name:String = "naoki"//プロパティ
    var age:Int = 10  //プロパティ
}

let Myname = Person()

print(Myname.name)//"naoki"

print(Myname.age)//10
````
ストアドプロパティには、値の変更を監視する**プロパティオブザーバ**と言う機能があります。

````example.swift
struct Practice {
    // ストアドプロパティ
    var training = "push ups" {
        willSet { //プロパティ変更前の値
            print("Yesterday's training is \(self.training).")
        }
        didSet {//プロパティ変更後の値
            print("Now training is \(self.training)")
        }
    }
    func CallTraining() {
        print("Training \(self.training)")
    }
}

var practice = Practice()

practice.CallTraining()//Training push ups

practice.training = "Squat"

practice.CallTraining()
//↑
//Yesterday's training is push ups.(willSet)
//Now training is Squat(didSet)
//Training Squat (CallTraining)
````
**willsetでプロパティが変更する前の値を確認できます。**
**didSetでプロパティが変更後の値を確認することができます。**

##コンピューテッドプロパティ
**コンピューテッドプロパティは、値を計算するプロパティの事を指します。**
**{}**の後に、getを使ってゲッタとsetを使用したセッタを定義して使うことができます。

````example.swift

struct Muscle {
  var weight = 30

  var Training: String {
    // ゲッタを定義
    get {
      if weight >= 40 {
        return "Perfect!!"
      }
      return "Good!!"
    }
    // セッタを定義
    set {
      print(newValue)
    }
  }
}

var MuscleTraining = Muscle()

let FirstTraining = MuscleTraining.Training

print(FirstTraining)//Good!!

MuscleTraining.weight = 50

let SecondTraining = MuscleTraining.Training

print(SecondTraining)//Perfect

MuscleTraining.Training = "Oh My God!!!"//Oh My God!!!

````
#定義される対象により分類されるプロパティ
定義される対象により分類されるプロパティには主に三つが挙げられます。

**インスタンスプロパティ**
**タイププロパティ**
**クラスプロパティ**

では順番に述べていきます。

##インスタンスプロパティ
**インスタンスを宣言して使用するプロパティをインスタンスプロパティと呼びます。**

````example.swift
struct Power {
    //インスタンスプロパティ
    var weight = 30
}

var MyMuscle = Power()//インスタンスの宣言

print(MyMuscle.weight)//30

print(Power.weight)//エラー
````

##タイププロパティ
**タイププロパティは型そのものに紐付いているプロパティです。**

````example.swift
struct Power {
    //インスタンスプロパティ
    var weight = 30
    //タイププロパティ
    static var training = "PushUp"
}

var MyMuscle = Power()

print(MyMuscle.weight)//30

print(Power.training)//PushUp
````

インスタンスを宣言しなくても、型にあるタイププロパティを使うことができます。

##クラスプロパティ
**クラスプロパティは、クラスに紐ずくプロパティのことです。**
クラスで共通の値を使いたい時に利用します。

````example.swift
class Power {
    var weight = 30
    
    class var training: String {
        return "PushUp!"
    }
}
print(Power.training)//PushUp!
````


#参考文献
[公式ドキュメント](https://swift.codelly.dev/guide/%E5%9E%8B%E3%81%AE%E6%A7%8B%E6%88%90/%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3.html#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AE%E5%AE%9A%E7%BE%A9%E6%96%B9%E6%B3%95)
[qiita文献](https://qiita.com/akeome/items/2197a635ac616ab2f8e2)
参考にさせていただきました。
ありがとうございます。
#まとめ
種類多すぎてパンクしました。