2016-10-11 1 views
1

CGSizeUserDefaultsに格納しようとしています。サイズは幅または高さがCGFloat.infinityです。私はNSValueとエンコードにサイズを入れてNSKeyedArchiverを使用して、それをデコード:NSKeyedArchiverを使用して無限次元のCGSizeをエンコードできない

let size = CGSize(width: CGFloat.infinity, height: 50) 
let value = NSValue(cgSize: size) 

let data = NSKeyedArchiver.archivedData(withRootObject: value) 
let unarchivedValue = NSKeyedUnarchiver.unarchiveObject(with: data) as! NSValue 

問題:寸法の一つが.infinityときにアーカイブされていないサイズが間違っている:不気味なことに、

print(size == value.cgSizeValue) // true 
print(size == unarchivedValue.cgSizeValue) // false 

print(size) // width: inf, height: 50.0 
print(unarchivedValue.cgSizeValue) // width: 50.0, height: 0.0 

注意widthは以前は高さであった値を持ちます。

同じ結果はDouble.infinityです。

+0

Appleにバグレポートを提出することをお勧めします。 –

+0

します。この問題を抱えている人のために、Alexはこの関連する質問に私を指摘しました:http://stackoverflow.com/questions/17059941 – tombardey

+0

[float INFINITYはNSCoderでアーカイブすることはできますが、デアーカイブしない]の可能な複製(https://stackoverflow.com)/questions/17059941/float-infinity-can-be-archived-by-nscoder-but-not-dearchived) –

答えて

0

あなたは代わりに文字列にCGSizeを保存することができます:

let size = CGSize(width: CGFloat.infinity, height: 50) 
let sizeString = NSStringFromCGSize(size) 
let decodedSize = CGSizeFromString(sizeString) 

これは、無限大の代わりに0を復元しますが、高さと幅が台無しになっていません。

+0

この問題がなぜ最初に存在するのか不思議です。それはデコード処理のバグか、 '無限大'が 'CGSize'と一緒に使われることを意図していませんか? – tombardey

+0

CGSizeで無限大を使うのではなく、NSKeyedArchiverを使ってフロート無限大をアーカイブするのが問題だと思います。無限大の値が32ビットに収まらないようです。 – alexburtnik

+0

ああ、わかります。リンクありがとうございます! – tombardey

関連する問題