LoginSignup
LILI_groove
@LILI_groove (LILI Groovy )

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

SwiftUI : get{}とset{}の定義

get{} , set{}の意味をわかりやすく解説してほしいです。
どのような場面で多く使われるのでしょうか。

1

1Answer

Swiftの言語仕様の中で、「クラス (Class)」の「コンピューテッド・プロパティ (Computed Property)」と呼ばれるものについてお尋ねなのでしょうか。
以下、クラスについての理解は、ある程度おありになることを前提に書かせていただきます。

コンピューテッド・プロパティの解説

最もシンプルなプロパティである「ストアド・プロパティ (Stored Property)」が、単なる変数として読み(get)書き(set)されるのに対して、コンピューテッド・プロパティでは、読み書きの処理方法を独自にプログラムすることができます。

ストアド・プロパティの例
class Test {
    var Value : Int = 0 // ストアド・プロパティ
}
var test = Test ()
test.Value = 12
print (test.Value)
// 12
コンピューテッド・プロパティの例 (上と等価)
class Test {
    var Value : Int { // コンピューテッド・プロパティ
        get { return value } // 値を読み出す処理
        set { value = newValue } // 値を書き込む処理
    }
    private var value : Int = 0 // 実際の値を保持するストアド・プロパティ
}
var test = Test ()
test.Value = 12
print (test.Value)
// 12

以下のような記事が参考になるかも知れません。

【Swift】セッター(Setter)、ゲッター(Getter)の処理を書く

【Swift】プロパティについてのまとめ

コンピューテッド・プロパティが使われる場面

使い道が多くて絞ることは難しいのですが、大まかには、他のメンバーなどを間接的に操作することで、別の概念を表すような使われ方ではないかと思います。

例えば、マトリクス上の位置を保持するPositionクラスがあるとして、そのマトリクスに対してリニアなインデックスでもアクセスしたいとしましょう。

class Position {
    var Width: Int = 0 // マトリクスの横サイズ
    var Height: Int = 0 // マトリクスの縦サイズ
    var X: Int = 0 // X座標
    var Y: Int = 0 // Y座標
    var Index: Int { // 線形位置
        get { // 読み出し
            return Y * Width + X
        }
        set { // 書き込み
            Y = newValue / Width
            X = newValue % Width
        }
    }
    init (width: Int, height: Int) { // 初期化
        Width = width
        Height = height
    }
}


var pos = Position (width: 8, height: 8) // マトリクスサイズ8×8で初期化
pos.X = 5 // X座標を5に
pos.Y = 4 // Y座標を4に
print (pos.Index)
// 37 が一次元座標として表示される
pos.Index = 12 // 一次元座標を12に
print (pos.X, pos.Y)
// 4 1 が二次元座標として表示される

※実用的なコードではありません。

0

Comments

  1. @LILI_groove

    Questioner
    ありがとうございます!!!
    基礎的な知識が定着していないので、調べながら参考にさせていただきます!

Your answer might help someone💌