2017-09-01 3 views
0

での操作より、コードの次の行に(iPhone 5、iOSの10.3.3上のすべての)リンゴからより多くのクラッシュレポート:クラッシュ()私が得たスウィフト

let date = NSDate() 
    var dateComponents = DateComponents() 
    dateComponents.hour = -6 
    let calculatedDate = NSCalendar.current.date(byAdding: dateComponents, to: date as Date) 

    let selectStatement = "SELECT nr from info where date > \(UInt((calculatedDate!.timeIntervalSince1970)) * 1000);" 

crash-レポートには、最後の行が問題行として示されます。したがって、calculateDateはインスタンス化されていないようです。自分で

以前のバージョンで

も、最初の行(iPhone 5、iOS版10.3.2)で発生したクラッシュ

に私はiPhone 6S上でこれらのクラッシュを再現することはできません。

これらの声明で何が問題になる可能性がありますか?

+0

Foundation Swiftに相当するネイティブタイプのFoundation型を使用しないでください。 'Date'と' Calendar'を使います。 –

+0

最初にNSStuff( 'NSDate'と' Date'、避けることができるキャストにつながる)とSwift Typesを混ぜているようです。これはSwift 3 Codeにはお勧めできません。 – Larme

+0

"私はiPhone 6sでこれらのクラッシュを再現することはできません。" ... iPhone 5シミュレータでやってください。簡単に再現できます。下記の[David's answer](https://stackoverflow.com/a/45996612/1271826)を参照してください。 – Rob

答えて

1

問題は、iPhone 5が32ビットデバイスであり、整数オーバーフローが発生していることです。明示的に結果をInt32にキャストするときは、エラーhereを参照してください。

UIntの代わりにUInt64を使用して、select文に整数値が必要な場合は、32ビットデバイスのオーバーフローの問題に対処してください。

ネイティブスウィフトタイプ(DateおよびCalendar)だけを使用できる場合は、ネイティブスウィフトタイプとFoundationタイプを混在させることはお勧めしません。

明示的問題を示すコード:行9で

import Foundation 

let date = Date() 
var dateComponents = DateComponents() 
dateComponents.hour = -6 
let calculatedDate = Calendar.current.date(byAdding: dateComponents, to: date) 
let selectStatement = "SELECT nr from info where date > \(UInt((calculatedDate!.timeIntervalSince1970)) * 1000);" 
print(selectStatement) //prints 1504234558000 
print(Int32(1504234558000)) 

がERROR、COL 7:整数オーバーフロー 'のInt32' プリント(のInt32(1504234558000))に 'のInt' から変換

+1

解決済みの問題です。過去2時間に必要な場所(U)Int64にプロジェクト全体を更新しました。どうも – tartsigam

0

NSDate()の代わりにDate()を使用してください。& NSCalendarの代わりにCalendar。

let date = Date() 
var dateComponents = DateComponents() 
dateComponents.hour = -6 
if let calculatedDate = Calendar.current.date(byAdding: dateComponents, to: date) { 
    let selectStatement = "SELECT nr from info where date > \(UInt((calculatedDate.timeIntervalSince1970)) * 1000);" 
} 
+2

そして 'NSCalendar'の代わりに' Calendar'を使ってください... –

+1

良い点はありますが、彼の問題とは無関係です。 – Rob

関連する問題