【问题标题】:Encoding CGSize with infinite dimension using NSKeyedArchiver fails使用 NSKeyedArchiver 对具有无限维度的 CGSize 进行编码失败
【发布时间】:2017-02-19 21:20:08
【问题描述】:

我正在尝试将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

问题:当其中一个维度为.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

请注意,奇怪的是,宽度的值是之前的高度。

Double.infinity 的结果相同。

【问题讨论】:

标签: ios swift macos cocoa cocoa-touch


【解决方案1】:

您可以将 CGSize 保存为字符串:

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

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

【讨论】:

  • 仍然想知道为什么这个问题首先存在。这是解码过程中的错误还是infinity 不打算与CGSize 一起使用?
  • 我想问题不在于在 CGSize 中使用无穷大,而在于使用 NSKeyedArchiver 归档浮点无穷大。似乎无穷大值不适合 32 位
  • 啊,我明白了。谢谢你的链接!
  • 不客气。我仍然建议坚持使用 NSStringFromCGSize 方法。它更短更可靠。
猜你喜欢
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
相关资源
最近更新 更多