質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1358閲覧

Computedプロパティについて

medamaoyaji

総合スコア14

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/09/14 20:24

Computedプロパティの説明を読んだ際に、getブロックは値を返し、setブロックは値の設定と記載されていました。
しかし、使用例を見ると
class Circle{
var radius:Double = 1.0
var area:Double{
get {
return radius * radius * Double.pi //areaの値を計算して返します
}
set(menseki){
radius = squat(menseki / Double.pi)} //areaの値を設定すると見せて、radiusの値を設定
}
}

let myCircle = Circle()
print("半径(myCircle.radius)")
print("面積(myCircle.area)")

myCircle.ara *= 2
print("半径(myCircle.radius")
print("面積(myCircle.area")
と書いてあり、値を返すのと値の設定の違いがわかりません。
また、これはareaの値を設定するためなのか、radiusを設定するものなのかわかりません。
例とComputedプロパティについての詳しく、知識がまだ少ない私にもわかるようにアドバイスをもらえると嬉しいです。どういう時に使えるなのかもお願いしたいです。
ゲットオンリー、セットオンリーなどについても教えてくれるとありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2018/09/18 02:25

コードは ``` で囲って下さい。
guest

回答1

0

ベストアンサー

通常の格納型プロパティ(Stored Property)だけで円(Circle)を定義してみるとします。

Swift

1class Circle { 2 var radius: Double = 1.0 3 var area: Double = Double.pi 4} 5 6var circle = Circle() 7circle.radius = 10.0 8circle.area = 20.0 // 面積おかしいでしょ 9print("circle 半径:(circle.radius), 面積:(circle.area)") 10
circle 半径:10.0, 面積:20.0

「円の面積=半径x半径xPi」なので、こんな状態になるようではCircleの実装がおかしいです。

必ずこの公式を守らせるためには、半径か面積のどちらかを計算で求めるようにします。

Swift

1class Circle { 2 var radius: Double = 1.0 3 var area: Double { 4 get { return radius * radius * Double.pi } 5 set { radius = (newValue / Double.pi).squareRoot() } 6 } 7} 8 9var circle = Circle() 10circle.radius = 10.0 // この値は上書きされる 11circle.area = 20.0 // 半径が変わる 12print("circle 半径:(circle.radius), 面積:(circle.area)") 13
circle 半径:2.52313252202016, 面積:20.0

このように計算で求めるべきプロパティ、あるいは他のプロパティに計算結果を反映すべきプロパティは
計算型プロパティ(Computed Property)で実装します。

これはareaの値を設定するためなのか、radiusを設定するものなのかわかりません。

あくまでも「Circleインスタンスの使用側から見て」 area の設定です。
使っている人はそのプロパティが格納型なのか計算型なのかを知っている必要はありません。
実装側が計算型で実装するのであれば、「プロパティを取得したい(get)」と言われれば
getブロック、「プロパティに設定したい(set)」と言われればsetブロックで対応します。

投稿2018/09/15 09:03

daisuke7

総合スコア1563

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問