54
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Stored property と Computed property

Last updated at Posted at 2016-08-28

格納型プロパティ(Stored property)、計算型プロパティ(Computed property)についてメモ
###そもそもプロパティって


クラスや構造体、列挙体等で定義することができる定数/変数のこと。

###格納型プロパティ (Stored property)


Structure
struct ExampleStructure {
    var Variable: Int
    let Constant: String
}

インスタンスの一部として定数/変数を格納する。
※構造体定義で例示している理由は、クラスで上記を定義すると
スクリーンショット 2016-08-29 1.38.55.png
初期化処理がないとエラーが吐かれる。

Class
class ExampleClass {
    var variable:Int
    let constant: String
    
    init(variable: Int, constatnt: String){
        self.variable = variable
        self.constant = constant
    }
}

クラスだと上記のように定義するか、初めから初期値を設定する。

Class_2
class ExampleClass_2 {
    var variable = 10
    let constant = "Constant"
}

こんな感じ
###計算型プロパティ (Computed property)


決まった値を保持しておらず、
インスタンスが生成される度に別プロパティから計算されて値を取得、設定されるプロパティで
getter/setterがある
※getterは単独で定義できるがsetterはgetterとセットでないと定義できない。

#####getter


class AreaOfTriangle {
    
    var base: Int
    var height: Int
    
    init(base: Int, height: Int) {
        self.base = base
        self.height = height
    }
    
    var triangle: Int {
        get{
            return base * height / 2
        }
    }
}

returnした値がtriangleに格納される。
ちなみにgetterのみの場合はget{}を省略できる。
getが読み込み専用というのはtriangleという変数そのものに値を代入(格納)することができないため。
アクセスすることしかできない。

#####setter


なぜかこのsetterがわかりづらかった。。。
インスタンス化された後computed propertyに別の値がセットされた時(値が代入された時)に呼ばれる。
※getはインスタンス化された時や、setによってgetで使っている値が変更された時に呼び出され、値が設定される。

class AreaOfTriangle {
    
    var base: Int
    var height: Int
    
    init(base: Int, height: Int) {
        self.base = base
        self.height = height
    }
    
    var triangle: Int {
        get {
            return base * height / 2
        }
        
        set(t) {
            base = t * 2
            height = t * 2
        }
    }
}

var a = AreaOfTriangle(base: 2,height: 2)
a.triangle = 5
print("\(a.base) , \(a.height)") //10 , 10

インスタンス化された後computed property(ここではtriangle)に別の値がセットされた時(値が代入された時)に呼ばれる。
※getはインスタンス化された時や、setによってgetで使っている値が変更された時に呼び出され、値が設定される。

動きとしては引数tに5が代入される。
そして以下のように、引数の代わりにnewValueを指定することもできる。

  set {
       base = newValue * 2
       height = newValue * 2
   }

###まとめ


計算型プロパティのsetterが自分の中で消化できなかったので調べて書いてみました。
間違いや例示したものが適切でない等ありましたらどしどしご指摘ください。

54
41
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
54
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?