私はiOS開発者ではありませんが、Swiftを学び始めました。
ロジックをAndroidプロジェクトからiOSに変換しようとしています
私は次の方法があります:
_func addGroupItemSample(sample : WmGroupItemSample){ // some custom class
var seconds: NSTimeInterval = NSDate().timeIntervalSince1970
var cuttDate:Double = seconds*1000;
var sampleDate: UInt64 = sample.getStartDate(); // <-- problematic place
if(sampleDate > cuttDate){
// ....
}
}
_
上記のメソッドから、sample.getStartDate()
がタイプ_UInt64
_を返すことがわかります。
私はそれをJavaのlong
のように思いました:System.currentTimeMillis()
ただし、ミリ秒単位の現在の時刻はDouble
として定義されています。
Double
と_UInt64
_を混在させるのは適切な方法ですか、それともすべてのミリ秒をDouble
のみとして表す必要がありますか?
おかげで、
Swiftでは、異なるタイプを比較することはできません。
seconds
は、秒単位の精度の秒単位のDouble
浮動小数点値です。sampleDate
はUInt64ですが、単位は指定されていません。 sampleDate
は、秒単位のDouble
浮動小数点値に変換する必要があります。
var sampleDate: Double = Double(sample.getStartDate())
次に、それらを比較できます。
if(sampleDate > cuttDate){}
iOSではdoubleを使用する方が良いですが、コードを簡単に移植して一貫性を保ちたい場合は、これを試すことができます。
func currentTimeMillis() -> Int64{
let nowDouble = NSDate().timeIntervalSince1970
return Int64(nowDouble*1000)
}
Swift 3の代替バージョンです:
/// Method to get Unix-style time (Java variant), i.e., time since 1970 in milliseconds. This
/// copied from here: http://stackoverflow.com/a/24655601/253938 and here:
/// http://stackoverflow.com/a/7885923/253938
/// (This should give good performance according to this:
/// http://stackoverflow.com/a/12020300/253938 )
///
/// Note that it is possible that multiple calls to this method and computing the difference may
/// occasionally give problematic results, like an apparently negative interval or a major jump
/// forward in time. This is because system time occasionally gets updated due to synchronization
/// with a time source on the network (maybe "leap second"), or user setting the clock.
public static func currentTimeMillis() -> Int64 {
var darwinTime : timeval = timeval(tv_sec: 0, tv_usec: 0)
gettimeofday(&darwinTime, nil)
return (Int64(darwinTime.tv_sec) * 1000) + Int64(darwinTime.tv_usec / 1000)
}
func get_microtime() -> Int64{
let nowDouble = NSDate().timeIntervalSince1970
return Int64(nowDouble*1000)
}
正常に動作しています