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

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

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

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

Q&A

解決済

2回答

270閲覧

コードの短縮について。swift3.x

midori0822

総合スコア61

Swift

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

0グッド

0クリップ

投稿2017/10/28 14:43

swift3.Xで書いた下のコードなんですが、このコードを短縮するとしたらどのようにしますか?

返信お待ちしてます

swift

1class BMIMeasure { 2 var height = 1.75, weight = 65.0 3 func calc(height: Double,weight: Double) -> Double { 4 let resultBMI = weight/(height*height) 5 return resultBMI 6 } 7 8} 9 10var himan = BMIMeasure() 11var heighT = 1.75 12var weighT = 65.0 13var BMI = himan.calc(height:heighT, weight: weighT) 14let sureBMI = round(BMI*10)/10 15var body = "" 16switch sureBMI { 17case 0...16: body = "痩せすぎです" 18case 16...17.5: body = "痩せてます" 19case 17.5...18.5: body = "痩せ気味です" 20case 18.5...25: body = "普通体型です" 21case 25...45: body = "太ってます" 22default: break 23 } 24 25print("身長:(String(heighT))m 体重:(String(weighT))kg… あなたのBMIは(String(sureBMI))です。(body)。")

BMIMeasure classに渡した変数の取り出し方がわからず
最後printするために変数を別に作成したheighT,weighTのところをそのまま取り出せる方法を特に聞きたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

あくまで一例です。イニシャライザを書いたりしたため短縮は出来ませんでしたが、その分若干リファクタリングと細部を調整してみました。

  1. クラスおよび関数をリネームすることで関数内に持ってこれるものを関数内に持ち込みます。
  2. Personにイニシャライザ(initの部分です)を持たせます。そうすることでクラス内に定数を宣言できるようになり、イニシャライザの中で初期化ができるようになるのでperson.personalHeightのように取り出すことができます。(どれもheightですが分かりやすく別々の名前をつけてます)
  3. switch文のインデントと値の範囲を調整します。インデントは可読性の面から、値の範囲は被ってるところがあるためです。

swift

1import Foundation 2class Person { 3 4 let personalHeight: Double 5 let personalWeight: Double 6 7 init(height: Double, weight: Double) { 8 self.personalHeight = height 9 self.personalWeight = weight 10 } 11 12 func calculateBMI() -> Double { 13 let BMI = personalWeight / (personalHeight * personalHeight) 14 let roundedBMI = round(BMI * 10) / 10 15 return roundedBMI 16 } 17 18} 19 20let height = 1.75 21let weight = 65.0 22let person = Person(height: height, weight: weight) 23let BMI = person.calculateBMI() 24 25var body = "" 26switch BMI { 27 case 0..<16: body = "痩せすぎです" 28 case 16..<17.5: body = "痩せてます" 29 case 17.5..<18.5: body = "痩せ気味です" 30 case 18.5..<25: body = "普通体型です" 31 case 25...45: body = "太ってます" 32 default: break 33} 34 35print("身長:(person.personalHeight)m 体重:(person.personalWeight)kg… あなたのBMIは(BMI)です。(body)。")

投稿2017/10/28 16:05

xAxis

総合スコア1349

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

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

midori0822

2017/10/29 07:13

initメソッドについてはまだまだ勉強不足であったため、とても参考になりました。 もう少し勉強してみます。返信ありがとうございました!
guest

0

BMIMeasure を計算機として扱うなら変数を保持するのはおかしいので、現状で良いと思います。

変数名に示されるように人間( human の typo だと思いますが)として扱いたいなら、( class 名も Human にすべきですが)その場合は引数で渡された値を保持すれば良いです。

投稿2017/10/28 15:42

ykws

総合スコア1236

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問