Ios 使用NSKeyedArchiver编码无限维CGSize失败

Ios 使用NSKeyedArchiver编码无限维CGSize失败,ios,swift,macos,cocoa,cocoa-touch,Ios,Swift,Macos,Cocoa,Cocoa Touch,我正在尝试将CGSize存储在UserDefaults中。大小的宽度或高度可以是CGFloat.infinity。我将大小放入NSValue中,并使用NSKeyedArchiver对其进行编码和解码: let size = CGSize(width: CGFloat.infinity, height: 50) let value = NSValue(cgSize: size) let data = NSKeyedArchiver.archivedData(withRootObject: val

我正在尝试将
CGSize
存储在
UserDefaults
中。大小的宽度或高度可以是
CGFloat.infinity
。我将大小放入
NSValue
中,并使用
NSKeyedArchiver
对其进行编码和解码:

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
问题:当其中一个维度为
时,未归档的大小错误。无穷大

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
请注意,奇怪的是,宽度的值以前是高度


对于
Double.infinity

的结果相同,您可以将CGSize保存到字符串中:

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

这将恢复0而不是无穷大,但高度和宽度不会变得混乱。

仍然想知道为什么会出现这个问题。这是解码过程中的错误还是
infinity
不打算与
CGSize
一起使用?我想问题不在于在CGSize中使用infinity,而在于使用NSKeyedArchiver归档float infinity。看来无穷大的值不适合32比特,我明白了。谢谢你的链接!不客气。不过我还是建议坚持NSStringFromCGSize方法。它更短更可靠。我建议在苹果公司提交一份bug报告。我会的。对于任何一个在这个问题上绊倒的人,Alex向我指出了一个相关的问题:可能是重复的