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

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

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

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

Q&A

解決済

1回答

603閲覧

Xcodeの計算型プロパティの挙動について

taratarasiteru

総合スコア1

Swift

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

0グッド

0クリップ

投稿2021/10/05 06:20

計算型プロパティで数値が変わる原因は何でしょうか?

詳解swift第5版の計算型プロパティのList3-16のコードでテキスト通りに動かないところがあります。
計算型プロパティのゲッタで値が変わってしまってますが何故でしょうか?

以下の実行結果から変数mlが4のところでは0.0ですが5で31.5735になります。
なんでですか?Xcodeのバグですか?仕様ですか?
またPrint文が4の次に8が実行されてから5が実行されてるのは何故ですか?

発生している問題・エラーメッセージ

プレイグラウンドでの実行結果

1 -- init ounce: 2.0
2 -- init Ounce.ounceUS: 29.5735
3 -- init ounce * Ounce.ounceUS: 59.147
4 -- ml: 0.0
8 -- ml: 31.5735
5 -- ml: 31.5735
6 -- Ounce.ounceUS: 29.5735
7 -- get: 1.0676281130065768
9 -- init self.ounce: 1.0676281130065768
31.5735

エラーメッセージはありません
Swift struct Ounce { var ml: Double = 0.0 static let ounceUS = 29.5735 init(ounce: Double) { print("1 -- init ounce: (ounce)") print("2 -- init Ounce.ounceUS: (Ounce.ounceUS)") print("3 -- init ounce * Ounce.ounceUS: (ounce * Ounce.ounceUS)") print("4 -- ml: (ml)") self.ounce = ounce //* Ounce.ounceUS print("8 -- ml: (ml)") print("9 -- init self.ounce: (self.ounce)") } //計算型プロパティounce var ounce: Double{ get{ print("5 -- ml: (ml)") print("6 -- Ounce.ounceUS: (Ounce.ounceUS)") print("7 -- get: (ml / Ounce.ounceUS)") return ml / Ounce.ounceUS } set{ ml = newValue + Ounce.ounceUS } } } var a = Ounce(ounce: 2.0) print("a.ml: (a.ml)")

試したこと

print文で数値が変わるところまでは確認できましたが、何で変わるのかわかりません。
MakBookの再起動、Xcodeの再起動はしてみました。

Xcode Version 12.5.1 (12E507)
macOS BigSur

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

正常な動作ですよ。

以下の実行結果から変数mlが4のところでは0.0ですが5で31.5735になります。
なんでですか?

4 のあと、self.ounce = ounce していますよね。

swift

1print("4 -- ml: (ml)") 2self.ounce = ounce 3// ounceは`var a = Ounce(ounce: 2.0)`で渡された`2.0`です

その結果、once のセッタ(set)の内容が実行されます。

swift

1//計算型プロパティounce 2var ounce: Double{ 3 ... 4 set{ 5 ml = newValue + Ounce.ounceUS 6 } 7}

すると、初期状態では var ml: Double = 0.00.0 だった ml2.0 + 29.5735 に変更されます。そのためこれ以降は値が変わっています。


またPrint文が4の次に8が実行されてから5が実行されてるのは何故ですか?

self.ounce = ounce ではセッタ(set)しかアクセスされず get の内容は実行されませんので、次は print("8 -- ml: (ml)") が実行されます。

print("9 -- init self.ounce: (self.ounce)") では self.ounce によってまずゲッタ get が実行されるので、5, 6, 7 が出力された後、文字列が完成した 9 が出力されています。

投稿2021/10/05 10:58

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

taratarasiteru

2021/10/05 16:29

ありがとうございます。スッキリです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問