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

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

ただいまの
回答率

87.37%

[swift]アプリの終了時刻と起動時刻の差分を取得したい

解決済

回答 1

投稿

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

score 7

前提・実現したいこと

現在、swiftでゲームを開発しています
その中で起動していない時間に応じて変化するパラメーターを追加するために、
起動時の時刻と終了時刻を取得して差分を取得しようと考え、
下記のコードを記述した結果、以下のエラーメッセージが発生しました。

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

Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional

該当のソースコード

import UIKit


class ViewController: UIViewController {

    let dataBase = UserDefaults.standard

    (中略)
    var number: Int = 0

    let f = DateFormatter()
    var finishTime: Date!
    var startTime: Date!
    var hourInterval:Double = 0.0
    var hInter = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        (中略)


        f.timeStyle = .full
        f.dateStyle = .full
        f.locale = Locale(identifier: "ja_JP")

    }

    (中略、この間にnumberを増やす処理がある)


    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    //開始時刻の取得
        self.startTime = Date()
        print(f.string(from: startTime))

    //保存されていた終了時刻の呼び出し
        if let _ = dataBase.object(forKey: "dateT") as? Date{
            self.finishTime = (dataBase.object(forKey: "dateT") as! Date)
               }
        self.LikeReduce()



    }

    func numberReduce(){
    //ここで数値を計算する

    ↓↓↓↓↓↓↓エラーの該当箇所↓↓↓↓↓↓↓
        self.hourInterval = startTime.timeIntervalSince(finishTime)
    ↑↑↑↑↑↑↑エラーの該当箇所↑↑↑↑↑↑↑

        self.hInter = Int(hourInterval)
        print(self.hInter)
        self.number -= hInter/3600 % 24/4
    }

    override func viewWillDisappear(_ animated: Bool) {
    //終了時刻を取得して保存
        self.finishTime = Date()
        print(f.string(from: finishTime))
        dataBase.set(finishTime, forKey: "dateT")
        self.finishTime = (dataBase.object(forKey: "dateT") as! Date)
    }



}

試したこと

おそらく、finishTimeにnilが入る可能性があるのが原因だと思うのですが……修正のやり方がよくわかりません

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

Xcode11.1

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

nil checkがきちんとできていないということですね。

func numberReduce(){
    print("startTime:", self.startTime)  // <- これを追加
    print("finishTime:", self.finishTime)  // <- これを追加
    //ここで数値を計算する
    self.hourInterval = startTime.timeIntervalSince(finishTime) // <- エラー行

    self.hInter = Int(hourInterval)
    print(self.hInter)
    self.number -= hInter/3600 % 24/4
}


となっているので、その前に
print("startTime:", self.startTime)
print("finishTime:", self.finishTime)
を記入ください。

self.finishTimeにはnilが返ってくると思います。
self.finishTimeに値が入っていない時に計算をしようとして、
「ないものとは計算できませんよ」ってエラーが起こっています。

なので、func numberReduce()のとこで、
nil判定を行い、
・nilなら計算しない、
・nil以外なら計算する
と分岐しないといけないです。

判定の仕方は
https://qiita.com/reoy/items/e0c5dd8d8201d7960a29
ここの「Swiftでのnil判定」を見てください。

また、最初のメンバ変数も

var finishTime: Date?
var startTime: Date?


とした方がいいと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/10/28 11:54

    回答ありがとうございます。リンク先も確認し、Optional型の使い方がやっと理解できました。

    キャンセル

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

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

関連した質問

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