🐦

ミニマルなサンプルで理解!Swiftのプロパティについて表で整理してみた✏️

2021/07/19に公開

"static"とか"class"とか、そもそもプロパティって何?という方に。参考になれば🤗

1. プロパティとは?

プロパティとは、型を構成している要素のうちで何かしらの値を持っているもののこと。
プロパティが「何に紐づくのか」という観点で、プロパティは3つに分類することができる。
表にまとめてみた👇

おなまえ キーワード 使う時に
インスタンス化が必要?
値は
書き換えられる?
初期値が必要? どこで宣言できる?
インスタンスプロパティ なし Struct内:
どちらでも
Class内:
書かない場合はイニシャライザが必要
Struct内:

Class内:
タイプ
プロパティ
static ✖️ Struct内:

Class内:
クラス
プロパティ
class ✖️ getterしか
記述していない場合は✖️
Struct内:
✖️
Class内:
プロパティは値の保持の仕方によって2つに分類することもできる(ストアドプロパティとコンピューテッドプロパティ)ようだが、今回は詳しくは触れない。

2. インスタンスプロパティ

以下の例でいう var name = "Tama" の部分がインスタンスプロパティ。

struct Cat {
    var name = "Tama"
}

インスタンスプロパティは、型のインスタンスに結びついているプロパティ。
言い換えると、インスタンス化しないと使えないプロパティ。

let cat1 = Cat()
print(cat1.name) // Tama と表示される

2-1. 値の書き換えについて

インスタンスに結びついているから、インスタンスごとに違う値を持つことができる。
インスタンス化した後で書き換えることができる

var cat2 = Cat()
cat2.name = "Kuro"
print(cat2.name) // Kuro と表示される

2-2. 初期値について

もし以下のように初期値を設定していなかった場合、

struct Cat {
    var name : String
}

インスタンス化する際にインスタンスプロパティの値の入力を求められる。

let cat1 = Cat(name: "Tama")
print(cat1.name) // Tama と表示される

ちなみにCatがStructではなくClassだった場合、
初期値を設定する(OKな例1)かイニシャライザを書く(OKな例2)かしないと怒られる。

初期値がなくて怒られてる図:

OKな例1:

class Cat {
    var name = "Tama"
}

OKな例2:

class Cat {
    var name : String
    init(name : String){
        self.name = name
    }
}

3. タイププロパティ(スタティックプロパティと表現されている場合もある)

static キーワードをプロパティにつける必要がある。

struct Cat {
    static var name = "Tama"
}

タイププロパティは、型そのものに結びついているプロパティ。
言い換えると、インスタンス化せずに使えるプロパティ。

print(Cat.name) // Tama と表示される

インスタンス化してから使おうとするとエラーになる

3-1. 値の書き換えについて

タイププロパティは書き換えることができる

Cat.name = "Kuro"
print(Cat.name) // Kuro と表示される

3-2. 初期値について

初期値を必ず持たせる必要があり、持たせていないと怒られる。

CatがStructではなくClassだった場合でも同様に、初期値を設定しないと怒られる。

4. クラスプロパティ

class キーワードをプロパティにつける必要がある。

class Cat {
    class var name : String {
        return  "Tama"
    }
}

クラスプロパティは、クラスに結びついているプロパティ。
こちらも、インスタンス化せずに使えるプロパティ。

print(Cat.name) // Tama と表示される

インスタンス化してから使おうとするとエラーになる
クラスに結びついているので、Structの中では使えない。

4-1. 値の書き換えについて

実は以下の書き方には省略されている部分がある。

class Cat {
    class var name : String {
        return  "Tama"
    }
}

省略せず書くと以下のようになる。

class Cat {
    class var name : String {
        get {
            return  "Tama"
        }
    }
}

クラスプロパティは、記事の最初の方の 別の分類方法として
ちょろっと出てきた”コンピューテッドプロパティ”に分類される。
コンピューテッドプロパティにはgettersetterというものがある。
上記のget{ }で囲まれている部分はgetterである。
上の例のように、プロパティにgetterだけ記述している場合は値を書き換えることができない
getterしか記述されていないCatのnameを変更しようとすると、以下のように怒られる。

4-2. 初期値について

初期値を必ず持たせる必要があり、持たせていないと怒られる。

おわりに

表にすることで、それぞれの特徴を比較しやすくなったε(^^)з
今回は深追いしなかった、 ストアドプロパティとコンピューテッドプロパティ についても
いつかまとめたい!
おしまい🤗

Discussion