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

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

ただいまの
回答率

87.34%

Unexpectedly found nil while unwrapping an Optional valueのエラーが出る

解決済

回答 2

投稿

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

score 6

前提・実現したいこと

Swiftで、身長と体重と歩数を使って消費カロリーを計算するアプリを作っています。
歩数から消費カロリーを計算するという処理で"Unexpectedly found nil while unwrapping an Optional value"というエラーが出てしまい困っています。
該当の変数にはnilではなく値が入っていると思うのですが、改善できません。間違いを教えていただけると幸いです。

エラー内容

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

該当のソースコード

override func viewDidLoad() {
        super.viewDidLoad()
        keiyuu = String(shoki)
        avoidingCheatSteps.text = String(stepa)
        weight2.text = myweight
        height2.text = myheight
        self.steppp = "0"
        self.keiyu.text = steppp


        let mywei = Double(myweight)
        let myhei = Double(myheight)
            let ste = Double(steppp)
        defer{



        let hoho:Double = myhei! * 0.45 //歩幅計算(身長X0.45)
            let km = ste! * hoho * 0.01 //歩行距離 (歩数X歩幅)
        let jikan = km / 81 //歩行時間(歩行距離÷歩行速度[81])
        let jikann = jikan / 60 //分を時に変更
        let kcal = 1.05 * 3.3 * jikann * mywei! //カロリー計算 1.05 X メッツ[3.3] X 時間 X 体重
        let Ikcal = Double(kcal)
        mycal.text = String("\(Ikcal)kcal")

        }

歩数取得のソースコード

        getCountStepUsingStatisticsQueryWithoutThirdpartyData(from: start, to: end) { (query, statistics, error) in
            DispatchQueue.main.async {
                if let stepa = statistics?.sumQuantity()?.doubleValue(for: .count()) {
                    self.avoidingCheatSteps.text = "\(Double(stepa)) steps"
                    self.keiyu.text = "\(Int(stepa)) steps"

                } else {
                    self.avoidingCheatSteps.text = "nul"
                }
            }
        }

試したこと

変数に初期値を与えてみたりしましたが、そのまま初期値が反映されてしまいました。

補足情報(FW/ツールのバージョンなど)

Xcode iOS13

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

check解決した方法

0

単純なミスでした。
steに入っていた値が「数字+steps」になっており、数字ではなかったのでnilになってました。

getCountStepUsingStatisticsQueryWithoutThirdpartyData(from: start, to: end) { (query, statistics, error) in
            DispatchQueue.main.async {
                if let stepa = statistics?.sumQuantity()?.doubleValue(for: .count()) {
                    self.avoidingCheatSteps.text = "\(Double(stepa)) steps"
                    self.keiyu.text = "\(Int(stepa)) steps"

                } else {
                    self.avoidingCheatSteps.text = "nul"
                }
            }
        }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

myweight, myheightの値を提示してください。
let mywei = Double(myweight)
let myhei = Double(myheight)
の処理でDoubleの生成に失敗していませんか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/30 21:38

    おそらくご指摘いただいた通り、
    let ste = Double(steppp)がnilになっていると思います。
    2つ目のコードの
    self.keiyu.text = "\(Double(stepa)) steps"
    のlabelの値をsteとして使いたい(使っているつもり)のですが、解決法はないでしょうか?
    ご教示頂けると幸いです。よろしくお願いします。

    キャンセル

  • 2019/09/30 21:46

    まず、提示するソースコードは再現できるもの、もしくは手を加えていないものにしてください。
    手を加えることにより問題が隠されることがあります。
    今回のケースでは、viewDidLoad()内で self.keiyu.text = steppp を行い、それをそのままDoubleを生成しているように見え、別のところでself.keiyu.textに設定した値を参照する様には見えません。

    あくまで self.keyiyu.text のStringを使用したいのでしたら、
    1. 半角スペースで文字列分割して文字列配列を生成する。
    2. 文字列配列の先頭だけを使用して Double化する。
    でできませんか。

    キャンセル

  • 2019/09/30 21:50

    まぁ、歩数取得のソースコードを絡めていない点で、私も考慮が足りてないと思いますが。。。

    キャンセル

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

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

関連した質問

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