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

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

ただいまの
回答率

90.76%

  • Swift

    6728questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 171

midori0822

score 31

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

返信お待ちしてます

class BMIMeasure {
  var height = 1.75, weight = 65.0
  func calc(height: Double,weight: Double) -> Double {
    let resultBMI = weight/(height*height)
    return resultBMI
   }

}

var himan = BMIMeasure()
var heighT = 1.75
var weighT = 65.0
var BMI = himan.calc(height:heighT, weight: weighT)
let sureBMI = round(BMI*10)/10
var body = ""
switch sureBMI {
case 0...16:  body = "痩せすぎです"
case 16...17.5: body = "痩せてます"
case 17.5...18.5: body = "痩せ気味です"
case 18.5...25: body = "普通体型です"
case 25...45: body = "太ってます"
default: break
  }

print("身長:\(String(heighT))m 体重:\(String(weighT))kg… あなたのBMIは\(String(sureBMI))です。\(body)。")


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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

    let personalHeight: Double  
    let personalWeight: Double  

    init(height: Double, weight: Double) { 
        self.personalHeight = height
        self.personalWeight = weight
    }

    func calculateBMI() -> Double {
        let BMI = personalWeight / (personalHeight * personalHeight)
        let roundedBMI = round(BMI * 10) / 10  
        return roundedBMI
    }

}

let height = 1.75
let weight = 65.0
let person = Person(height: height, weight: weight)
let BMI = person.calculateBMI()

var body = ""
switch BMI {
    case 0..<16: body = "痩せすぎです"
    case 16..<17.5: body = "痩せてます"
    case 17.5..<18.5: body = "痩せ気味です"
    case 18.5..<25: body = "普通体型です"
    case 25...45: body = "太ってます"
    default: break
}

print("身長:\(person.personalHeight)m 体重:\(person.personalWeight)kg… あなたのBMIは\(BMI)です。\(body)。")

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/29 16:13

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    swift TableViewのimageの大きさを一定に固定する方法について

    SwiftのtableViewにおいてimageの大きさを一定にする方法について質問します。 func tableView(tableView: UITableView, c

  • 解決済

    UIButton not working

    現在 UIViewControllerの上に、 let collectionView = UICollectionView() let collectionViewCell

  • 解決済

    swift3で条件分岐でUIImageViewの表示を変えたい

    swift3 Xcode8.2.1でswitch文で画像を表示を入れ替えるシステムを作っています。 画像を入れ替える機能を実装中に以下のエラーメッセージが発生しました。 発

  • 解決済

    pickerView 内の文字の色を変えたい

    pickerView内の文字の色とサイズを変更したいのですがウェブで調べても出てこなかったためここで質問させていただきます。 storyBoardの編集でそれは可能でしょうか

  • 解決済

    pickerViewの外に値を移す

    タイトルの通りの質問です。 下記のコードで数値2つを入力、それを演算子1つ選んで計算するツールを作っています。 import UIKit class ViewControll

  • 解決済

    Swift ラベルの座標を動的にずらす方法

    Swift3にて、UILabelを縦に並べて表示させた場合に、文字列が多いなどで改行させてラベルの高さを動的に可変させた場合に、それ以降に並んだラベルの座標位置を自動的にずらす方法

  • 受付中

    swift キャストできない

    import UIKit class ViewController:UIViewController ,UITextFieldDelegate { @IBOutlet

  • 解決済

    アラートで入力した文章を読み上げたい

    アラートで入力した値を変数textFieldに代入し、関数voice()で読み上げたいのですが、変数textFieldをどのようにして関数voice()に渡せばいいのかわかりません

同じタグがついた質問を見る

  • Swift

    6728questions

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