学生かえるエンジニアのブログ

iOSを主にやる勉強中エンジニア。かえるが好き。ピクルスってかわいいよね。

Swift / 変数・定数(property)編

以前「Optional 〇〇」系の言葉についてまとめた記事を上げてみました。

yuki0n0.hateblo.jp

今回は変数・定数などのpropertyについてまとめたいと思います。

今回は名称だけでなく記述方法等、使い方にも少し踏み込みたいと思います。

Property

下記のようないわゆる変数・定数がありますね。

var name = "yuki"

これをpropertyといいます。これには大きく2種類あります。

Stored Property (保持型プロパティ)*1

var name = "yuki"
let name = "yuki"

これは通常の変数・定数です。

プロパティ監視

var name = "yuki" {
    willSet(newName) {
        print("\(name)から\(newName)に変更するよ")
    }
    didSet(oldName) {
        print("\(oldName)から\(name)に変更したよ")
    }
}

このようにゲッターセッターを備えることが出来ます。 このプロパティ監視は stored property にのみ使用できます。

もし引数を与えない場合、willSet内ではnewValue、didSet内ではoldValueという名前で値が取得できます。

下記に使用条件等を示しておきます。

  • このプロパティ監視は保持型プロパティの変数(var)のみに使用できます。
  • didSet内で自分自身の値を変更すると、上書きされ、この際プロパティ監視は呼ばれません。
  • 後述の遅延評価プロパティ(lazy)には使用できません。

Lazy Stored Property (遅延評価プロパティ)

lazy var human = Human()

先頭にlazyとつけることで遅延評価プロパティとなります。アクセスされるまでインスタンスが生成されないと言うものです。

重いインスタンス生成で、使用されるかわからないプロパティなどに使用すると価値が発揮されます。

  • 保持型プロパティの変数のみに使用できます。
  • 先述のプロパティ監視は使用できません。

Computed Property (計算型プロパティ)

var height: Int = 9
let width: Int = 10
var area: Int {
    set(newArea) {
        height = newArea / width
    }
    get {
        return height * width
    }
}

computed property は、3行目のareaのようなpropertyを言います。名称の通り、計算をするプロパティであり、値は保持しません。

setに引数を与えない場合、set内でnewValueという名前で値を取得できます。

  • varだけ使用できます。(letは使用しません。)
  • 型を指定しなければいけません。(stored propertyのような型推論は無いです。)

read-only computed property

var area: Int {
    return height * width
}

もし computed property でgetのみを使用する場合、get{}は省略できます。こうすることでreadonlyなプロパティとなります。

参考

後記

夏休みになりました。

もし間違い等ありましたらコメントなどで教えてください。感想なども待ってます!

*1:格納型プロパティとも呼ばれるそうです