1. ホーム
  2. swift

[解決済み] SwiftでNSDatesの秒数の差を整数値で求める。

2022-11-20 23:07:53

質問

ボタンが押されている時間を計りたいコードを書いています。これを行うために、私は NSDate() を記録し、その後に timeIntervalSinceDate 関数を使用してみました。それは動作するようですが、結果を印刷したり、整数に切り替えたりする方法が見つかりません。

var timeAtPress = NSDate() 

@IBAction func pressed(sender: AnyObject) {
    println("pressed")
    timeAtPress = NSDate()
}

@IBAction func released(sender: AnyObject) {
    println("released")
    var elapsedTime = NSDate.timeIntervalSinceDate(timeAtPress)
    duration = ???
}

似たような質問をいくつか見かけましたが、私はC言語を知らないので、与えられた答えを理解するのに苦労しました。もし、ボタンが押されていた時間を調べるのに、もっと効率的な方法があれば、提案を受け付けます。よろしくお願いします。

どのように解決するのですか?

計算の試み elapsedTime は正しくありません。Swift 3 では、次のようになります。

let elapsed = Date().timeIntervalSince(timeAtPress)

この () の後に Date を参照します。は Date() は新しい日付オブジェクトをインスタンス化し、次に timeIntervalSince との時差を返します。 timeAtPress . これは浮動小数点値を返します(厳密には TimeInterval ).

として切り詰めたい場合は Int の値にしたい場合は、単に

let duration = Int(elapsed)

ちなみに、あなたの定義する timeAtPress 変数をインスタンス化する必要はありません。 Date オブジェクトをインスタンス化する必要はありません。あなたが意図したものと推測されます。

var timeAtPress: Date!

これは、変数を定義する Date 変数 (暗黙のうちにアンラップされたもの) として定義していますが、おそらくその変数の実際のインスタンスの作成は pressed が呼び出されるまで、その変数の実際のインスタンス化は延期されると思われます。


あるいは、よく使うのは CFAbsoluteTimeGetCurrent() , などです。

var start: CFAbsoluteTime!

そして startTime を設定したいときは、次のようにします。

start = CFAbsoluteTimeGetCurrent()

そして、経過秒数を計算したいときは、次のようにします。

let elapsed = CFAbsoluteTimeGetCurrent() - start


注目すべきは CFAbsoluteTimeGetCurrent のドキュメントが警告しています。

この関数を繰り返し呼び出しても、結果が単調に増加することは保証されません。外部時刻参照との同期や、ユーザーによる明示的な時刻変更により、システム時刻が減少する可能性があります。

つまり、これらの調整が行われたときに運悪く経過時間を測定してしまった場合、間違った経過時間の計算をしてしまう可能性があるということです。これは NSDate / Date の計算もします。最も安全なのは mach_absolute_time ベースの計算を行うのが最も安全です (最も簡単に行えるのは CACurrentMediaTime ):

let start = CACurrentMediaTime()

let elapsed = CACurrentMediaTime() - start

これは mach_absolute_time で説明した複雑な部分を避けています。 テクニカル Q&A QA1398 .

しかし、次のことを忘れないでください。 CACurrentMediaTime / mach_absolute_time は、デバイスを再起動するとリセットされます。つまり、アプリの実行中に正確な経過時間の計算が必要な場合は CACurrentMediaTime . しかし、この開始時刻を永続的なストレージに保存して、将来のある時点でアプリを再起動したときに呼び出すことができるようにするには Date または CFAbsoluteTimeGetCurrent といった具合に、あらゆる不正確さに耐えられるようにしましょう。