[解決済み] SwiftでNSDatesの秒数の差を整数値で求める。
質問
ボタンが押されている時間を計りたいコードを書いています。これを行うために、私は
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
といった具合に、あらゆる不正確さに耐えられるようにしましょう。
関連
-
[解決済み] Swiftのstatic funcとclass funcの違いは何ですか?
-
[解決済み] 使用しているSwiftのバージョンを確認するにはどうすればよいですか?
-
[解決済み] Swiftでdispatch_onceのシングルトンモデルを使う
-
[解決済み] Swiftでリストアイテムのインデックスを見つける方法は?
-
[解決済み】==と===の違いについて
-
[解決済み】Swiftの`let`と`var`の違いは何ですか?
-
[解決済み】Swiftで2つのDate(月/日/時間/分/秒)の差を取得する。
-
[解決済み] Swiftダブルからストリング
-
[解決済み] Swift 1.2では、宣言は「final」と「dynamic」の両方にはなり得ないというエラーがある
-
[解決済み] swiftにおける "precondition "と "assert "の違いとは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Swiftで2つのDate(月/日/時間/分/秒)の差を取得する。
-
[解決済み] Swiftで1つのビューコントローラの向きを縦向きのみに固定する方法
-
[解決済み] swiftで改行なしの印刷をする
-
[解決済み] クラス 'ViewController' は swift で初期化されません。
-
[解決済み] UIViewの定高制約をプログラムで更新するには?
-
[解決済み] Swiftスクリプトでターミナルコマンドを実行するには?(例:xcodebuild)
-
[解決済み] 非'@objc'メソッドは'@objc'プロトコルのオプション要件を満たしていない
-
[解決済み] Swift: インデックスで文字列配列を置換する
-
[解決済み] ビルド入力ファイルが見つかりません」Swift 4.2、Xcode 10.0
-
[解決済み] Swift の @escaping と Completion ハンドラ