見出し画像

Swiftを始めよう! - Class 2

プロパティのgetter と setter

NamedShapeを継承する EquilateralTriangleです。

プロパティを使って操作します。

プロパティとは型(クラス、構造体、列挙型)を構成する要素の一つで、型もしくは型のインスタンスに紐付いた値を指します。
ちなみに型を構成する他の要素としてはメソッド、イニシャライザ、サブスクリプト、ネスト型があります。

https://qiita.com/akeome/items/2197a635ac616ab2f8e2
    class EquilateralTriangle: NamedShape {
        var sideLength: Double = 0.0

        init(sideLength: Double, name: String) {
            self.sideLength = sideLength
            super.init(name: name)
            numberOfSides = 3
        }

        var perimeter: Double {
            get {
                return 3.0 * sideLength
            }
            set {
                sideLength = newValue / 3.0
            }
        }

        override func simpleDescription() -> String {
            return "An equilateral triangle with sides of length \(sideLength)."
        }
    }

この場合のプロパティは

var sideLength: Double = 0.0

そしてgetter と setterを使った以下。計算プロパティ、computed proparty。

get     値が与えられた場合は計算をします。
set.    新しく値を入力することができます。

var perimeter: Double {
      get {
            return 3.0 * sideLength
      }
     set {
           sideLength = newValue / 3.0 }
      }

実行してみます。変数 triangleに入れて使えるようにします。

var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")

そのままパラメータの値を出力

  print(triangle.perimeter)

すると"9.3"とでてきます。

3.0  * 3.1   =  9.3  と計算されました。" 3.0 * sideLength "が実行されたということです。

今度は新しい値を入れてみます。

triangle.perimeter = 9.9

そして出力。

print(triangle.sideLength)

"3.3000000000000003"とでてきます。

9.9 / 3.0  = 3.3000000000000003

 ということです。


プロパティのwillSet and didSet

プロパティオブザーバを使います。変数の値の変化を監視して変更する必要がある場合に動いてくれます。

格納型プロパティ(Stored Property)の値が更新される際、それをトリガーとしてあるブロックを実行させることができる仕組み。

https://masasophi.com/propertyobserver/

例示のクラスです。willsetは代入される前に実行されます。(didsetは代入後に実行されます)

三角形triangleの辺の長さと四角形squareの辺の長さが必ず同じに設定されるように保証され、初期化で値が変更されるたびに実行されます。

    class TriangleAndSquare {
        var triangle: EquilateralTriangle {
            willSet {
                square.sideLength = newValue.sideLength
            }
        }
        var square: Square {
            willSet {
                triangle.sideLength = newValue.sideLength
            }
        }
        init(size: Double, name: String) {
            square = Square(sideLength: size, name: name)
            triangle = EquilateralTriangle(sideLength: size, name: name)
        }
    }

実行します。まず変数triangleAndSquareに代入してクラスを使えるようにします。

var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")

出力します。

print(triangleAndSquare.square.sideLength)
print(triangleAndSquare.triangle.sideLength)

10.0
10.0

クラスを使えるようにします。

triangleAndSquare.square = Square(sideLength: 50, name: "larger square")

出力します。

print(triangleAndSquare.triangle.sideLength)

50.0

クラスにもオプショナルを使うことができます。

    let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
    let sideLength = optionalSquare?.sideLength

値がある場合には通常のように動作しますが

let optionalSquare: Square? = nil

の場合は以下のコードは"nil"として処理されます。


この記事が気に入ったらサポートをしてみませんか?