struct Circle {
// Properties
var radius: Double {
didSet {
if oldValue < 0 {
radius = 0
}
}
}
var area:Double {
get{
return Double.pi * pow(radius, 2)
}
}
var circumference: Double {
get {
return 2 * radius * Double.pi
}
}
init() {
radius = 0
}
init(radius r: Double) {
radius = r
}
}
// test circle
var testCircle = Circle()
print ("radius:", testCircle.radius, "area: ", testCircle.area, "circumference: ", testCircle.circumference)
var testCircle2 = Circle(radius: 2.5)
print("radius: ", testCircle2.radius, " area: ", testCircle2.area, "circumference: ", testCircle2.circumference)
var testCircle3 = Circle(radius: 20)
print("radius: ", testCircle3.radius, "area: ", testCircle3.area, "circumference: ", testCircle3.circumference)
var testCircle4 = Circle(radius: -4.5)
print("radius: ", testCircle4.radius, "area: ", testCircle4.area, "circumference: ", testCircle4.circumference)
0
A
答えて
1
実際にプロパティが変更された後にdidSet
が呼び出されます。 oldValue
には前の値が入ります。
新しい値が負であるかどうかを確認する必要があります。
更新コードに:あなたはradius
(最新値)が負であるかどうかを確認したい
var radius: Double {
didSet {
if radius < 0 {
radius = 0
}
}
}
。 didSet
とwillSet
は、初期化中に呼び出されていないため
init(radius r: Double) {
radius = r >= 0 ? r : 0
}
これは、次のとおりです。
はまた、あなたのinit
方法を更新する必要があります。したがって、init
メソッドはパラメータを検証する必要があります。さらに以下のようにあなたのradius
とcircumference
プロパティを簡素化することができますサイドノートとして
:
var area:Double {
return Double.pi * pow(radius, 2)
}
Aは、読み取り専用のコンピュータのプロパティはget { }
を必要としません。
2
didSet
init
の間はプロパティオブザーバが呼び出されません。割り当てをdefer { ... }
ステートメントにラップして、didSet
を強制的に呼び出すことができます。例えば
:デフォルトの半径は0
になりたい場合は
init(radius r: Double) {
defer { radius = r }
}
、私はそうのようなradius
のデフォルトパラメータ値を使用してお勧めします:
init(radius r: Double = 0) {
defer { radius = r }
}
...あなたは2つのinitメソッドを避け、Circle()
(radius = 0
)とCircle(radius: 3)
(radius = 3
)としてまだCircle
を初期化します。
関連する問題
- 1. 私の条件演算子はなぜ機能しませんか?
- 2. 代入演算子が機能しません
- 3. 演算子のオーバーロードは代入演算子でどのように機能しますか?
- 4. なぜ離接代入演算子| =はboolのベクトルでは機能しないのですか?
- 5. suppressWarnings()はパイプ演算子では機能しません
- 6. 代入演算子(| =)はどのように機能しますか? (C#)
- 7. なぜこのコードは機能しませんか? Javascriptのif文、else if文
- 8. 空コンディショナリング演算子は代入に使用できません。
- 9. 派生クラスで基本クラス演算子=(代入演算子)を使用しないのはなぜですか?
- 10. C++の代入演算子または増分演算子
- 11. ":"演算子は代入演算子 "="と同等ですか?
- 12. Prolog '=='演算子は機能していませんか?
- 13. BigQueryのモジュロ演算子(%)は機能しませんWHERE句
- 14. 演算子==テンプレート関数では機能しません
- 15. 代入演算子
- 16. JavaScriptの代入演算子
- 17. 等号/代入演算子文内
- 18. REマッチング演算子はこのスクリプトでは機能しません
- 19. 代入演算子の仕組みがわかりません
- 20. 代入演算子以外のC++の演算子は継承されませんか?
- 21. 親クラスの代入演算子は、派生クラスからアクセスすることはできませんなぜ
- 22. Javaコンパウンド代入演算子と代入演算子
- 23. 代入演算子の呼び出しコンストラクタはなぜですか?
- 24. なぜビットワイズ&演算子は短絡していませんか?
- 25. なぜ私の挿入機能は動作しませんか?
- 26. コピーコンストラクタと代入演算子のオーバーロードがC++で機能しない
- 27. JavaScriptの代入演算子
- 28. 演算子if演算子
- 29. テンプレートクラスの代入演算子
- 30. Ruby代入演算子
半径値が0より小さい円を作成しようとするのが目的です。これは新しいです! – Tom
この小切手の目的は何ですか?ユーザーが負の値を設定するのを禁止し、その場合は0に設定しますか?これが当てはまる場合は、 'oldValue'ではなく' radius'の現在の値をチェックする必要があります。後者は、*あなたが変更を行う*前の値が何であったかをチェックします。 –
いくつかの管理ポイント:1.コードが適切にフォーマットされていることを確認します。質問の内容の中にあなたの質問があるかどうかを説明する必要があります。タイトルやコメントにはありません – toddg