2017-08-07 9 views
0

かなり長いIntを処理する必要があります。 Int64(String)は64ビットデバイスで正常に動作しますが、32ビットデバイスでクラッシュすることがあります。これの理由は何ですか?ここで文字列をInt64にキャストすると32ビットデバイスでクラッシュする

コードです:

let predicateBarcode = NSPredicate(format: "barcode = %ld", Int64(searchTerm)!) 

私は検索語については何も言うことができない、それはバーコードスキャナから来ているとEAN-13です。これは私のコモマーにとってただ起こっているので、私はクラッシュを再現することもできません。

+2

「Int64」は、32ビットプラットフォームと64ビットプラットフォームの両方で64ビット符号付き整数を表します。だから、通常、私たちはそのような振る舞いを見ることができません。問題を再現するために、より多くのコンテキストを表示できますか? – OOPer

+1

コードとクラッシュの詳細を示してください。 – Paulw11

+0

これは本当にあなたが使用している正確なコードですか?あなたのコードはXcode 8.3でコンパイルされません。たとえあなたが無関係だと思っても、何も省略しないでください。クラッシュ時に 'searchTerm'の値を表示します。とにかく、あなたのコードは64ビットプラットフォームでも有効なコードではありません。 – OOPer

答えて

3

Int64.init(_:)の問題ではなく、NSPredicateに与えられた形式の問題です。

長さ指定lは、その引数がIntまたはスウィフトでUIntに相当しますlongまたはunsigned long、する必要があることを意味します。

String Format Specifiers

あなたはフォーマット引数としてInt64値を使用したい場合は、右の長さ指定子はスウィフトでInt64に相当するlong longを意味し、llです。

let predicateBarcode = NSPredicate(format: "barcode = %lld", Int64(searchTerm)!) 

他の部分を修正する必要があるかもしれませんが、他の部分を隠しているとわかりません。 (そして私が試した限りでは、テストアプリをクラッシュさせることはできませんでした)さらに、Int64(searchTerm)!については100%の確率でクラッシュすることはありませんか?

とにかく、フォーマット文字列は少なくとも固定する必要があります。

+0

ありがとう、私はこれを修正します。 Int64(searchTerm)がnilでないことを確認するコードを追加しました。 –

+0

あなたのコードには他に欠陥がないことを願っています。がんばろう。 – OOPer

関連する問題