#■staticプロパティ(タイププロパティ)とは
同じクラスから生成された複数のインスタンスで同じ定数を使えるようにするもの。
■インスタンスとは
class Abc {
var name = ""
static sInt = 0
}
//下記のabcにあたる部分 クラスAbcをインスタンス化してインスタンスabcが誕生してる。
var abc = Abc()
var abc2 = Abc()
//これで同じクラスから生成された複数のインスタンスが生まれた
//abcとabc2の事ね
これを踏まえて下記を見ていきましょう!
class Abc {
var name = "名前なし"
static sInt = 0
func aaa() {
print("\(name)は\(Abc.sInt)歳です。")
}
}
var abc = Abc()
var abc2 = Abc()
abc.name = "佐藤健"
Abc.sInt = 100
abc.aaa()
//結果: 佐藤健は100歳です。
abc2.aaa()
//結果: 名前なしは100歳です。
なぜこうなる?
■インスタンスプロパティはインスタンスを呼んで値を代入する。
abc.name = "佐藤健"
その場しのぎ
今回の場合はabcのインスタンス内でのみ変更されている。
■staticプロパティは直接型(ここではAbc)を呼んで値を代入している。
Abc.sInt = 100
というような書き方になる。
直接型を呼んで代入してるので
abcのインスタンスがなんや関係なく
とりあえずclassAbcの中のstaticプロパティそのものを変更してる。
これを踏まえると
abc2のインスタンスでaaaメソッドを呼んだ時
以前にstaticプロパティのそのものが100に変えられていたので
結果: 名前なしは100歳です。
と言う結果となった。
つまり
同じクラスから生成された複数のインスタンスで同じ定数を使えるようになった。
#■これを応用してちょっとだけ本格的にstaticを使う。
準備
このような画面を作ったとっする。
Buttonを押せばオレンジの画面から青い画面に遷移する。
■class Akunを準備する。
class Akun {
var name = "名前なし"
static var sInt = 0
}
オレンジ上のラベルをnameLabelとして紐づける。
オレンジ下のラベルをintLabelとして紐づける。
下記のようにコードを書く
青い画面のコード
青い上のラベルをnameLabelとして紐づける。
青い下のラベルをintLabelとして紐づける。
下記のようにコードを書く
■結果
オレンジ画面
nameLabelは佐藤健
intLabelは100
Buttonを押して青い画面に遷移
nameLabelは名前なし
intLabelはstaticプロパティ使ってて
以前に100に直接値変えられているので100になった。
同じクラスから生成された複数のインスタンスで同じ定数を使えている。
これがstaticプロパティ!!!!!!!!!