質問: newValue (コメントアウト) //その他何かの処理 } } ``` すると、今度はgetの部分でクラッシュし、なんどもgetが実行されているようでした。 getに関してはそのまま返してほしいのですが、 もしかして私がゲッターとセッターの使い方を間違えているのでしょうか。
回答: プロパティの参照方法について誤解があるようです。 > > 実行するとまず、setの部分の`set.height = newValue`でクラッシュし、 調べてみると、 > > `self.height = newValue`がなんども実行されていたためでした。 > > > 「`self.height = newValue`がなんども実行されていた」のは、「setにおいては何もしなくてもこの処理は行われており、書き手が明示的にこのように書く必要はない」からではなく、あなたが「なんども実行され」るようなコードを書いているからです。 Swiftにおいて、`self.height`という書き方は単にプロパティを参照するもので、`self.`を付けたからといって、今定義しようとしているプロパティとは別の何かを参照してくれるわけではありません。従って ``` set { self.height = newValue } ``` と書いてしまうと、プロパティのsetter定義の中で今まさに定義しようとしているsetter自身を呼んでいることになります。当然、無限の再帰呼び出しとなりスタックがあふれたところでクラッシュします。 もうお分かりだと思うのですが、getterの方も同じことが起こっています。 ``` get { return self.height } ``` と書いてしまうと、今まさに定義しようとしているgetterの中で、そのgetterを呼んでいるわけです。 Swiftであなたがやろうとしているような処理を書こうとすると、あなたが`self.height`で表そうとしていた何かを明示的に宣言してやる必要があります。 ``` private var _height: CGFloat = 0.0 internal var height: CGFloat { get { return _height //->自分自身(height)のgetterを呼んではいけない } set { _height = newValue //->自分自身(height)のsetterを呼んではいけない //その他何かの処理 } } ``` あるいは、こんな書き方の方がSwiftっぽいとしてSwift派の皆さんには好まれるかもしれません。 ``` internal var height: CGFloat = 0.0 { didSet { //その他何かの処理 } } ``` お試しください。