エンコーディング/ 32 VSにCGFloatを復号化する64ビット
-
20-09-2019 - |
質問
私は64ビットで動作するアプリケーションを変換しています。アップルのドキュメントはCGFloat
タイプは、32ビットと64ビットでfloat
にdouble
されている状態。
、どのように値のエンコード/デコードを処理していますか?例えば、NSNumber
からCGFloat
を作成する場合は、私がするNSNumberの-numberWithFloat:
または-numberWithDouble:
メソッドを使用する必要がありますか?同じ質問はNSCoder
とNSKeyedArchiver
方法の-encodeFloat:forKey:
と-encodeDouble:forKey:
に適用されます。
その-numberWithFloat:
は64ビットで、32ビットおよび-numberWithDouble:
に呼び出されたので、私は条件付きマクロを記述する必要がありますか?
はどうなりますか?
CGFloats
を使用する私のアプリでは、すべての方法は、これまでdouble
の精度レベルを必要とする可能性は低いので、私もこれを心配すべきですか?
解決
APPの64ビットバージョンを実行して、ユーザがこれらの値はダブルとして符号化されたファイルは、32ビットシステム上/アーカイブされていない開いているファイルを保存した場合、はどうなりますか?
何も特別。ファイルには、double
が含まれている、とあなたがdecodeDouble:forKey:
を取得しますので、おそらくあなたは、値を取得するためにdouble
を送っています。あなたはそれがCGFloat
-たためにあなたは32ビットマシンにしている場合には精度を失うことになるキャストすることはできますが、遅かれ早かれそのキャストを行う必要があります。 (あなたがdouble
上に保持している場合でも、あなたはまだあなたがクォーツ/のAppKit / UIKitのに値を渡すときCGFloat
にキャストする必要があります。)
の代替を考えてみましょう:あなたは64ビットマシン上のファイルにfloat
sを保存し、その後、同じマシン上でのバックファイルをロードします。あなたがファイルを書いたとき、あなたがそれを捨てたので、あなたとQuartzは、64ビットのdouble
タイプの完全な精度を扱うことができますが、それを持っていません。値はキャストでは全く変更した場合、その変更は今永久的です。
だから私のお勧めは、あなたがのことはありませんのはdouble
以外のものを(すなわち、ターゲットAPIのみfloat
を使用し、決してfloat
)を使用しようとしていることを知っている限り、常に、NSKeyedArchiverとdouble
タイプを使用することです。 CGFloat
ため、double
を使用するので、これは、クォーツの真実ではありません。