【问题标题】:Swift NSCoding with NSValue使用 NSValue 的 Swift NSCoding
【发布时间】:2015-06-18 23:01:03
【问题描述】:

NSValue 不是 NSObject 吗?那我为什么会崩溃

    var coordinatesRawData = NSValue(MKCoordinate: coordinates.first!)
    if coordinatesRawData != nil {
        // Crashing here. I have a valid NSValue object
        aCoder.encodeObject(coordinatesRawData, forKey: "coordinatesRawData")
    }

错误日志

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSKeyedArchiver encodeValueOfObjCType:at:]: this archiver cannot encode structs'

但如果我这样做

    var coordinatesRawData = NSValue()
    aCoder.encodeObject(coordinatesRawData, forKey: "coordinatesRawData")

没有崩溃 - 两者都是 NSValues .. 对吗?

注意,我所有的其他 NSCoding / Decoding 工作正常。

【问题讨论】:

  • 我相信这是因为键控存档器无法获取结构条目的键。另一种选择是您使用可能对您有用的 NSArchiver,但会降低灵活性。或者不要使用结构并存储单独的字段或创建自己的支持 NSCoding 的对象。
  • 我认为 NSValue 就像一个 Wrapper,我可以把这个 Struct 扔进去,变成金色的。猜不出来,我有一个解决办法,但这会更干净。
  • 在我看来 NSValue(MKCoordinate:) 坏了。您应该就此提交错误报告。
  • 这是我在短时间内发现的第二个错误。 stackoverflow.com/questions/30158193/… 我同意它一定是一个错误。

标签: ios swift nscoding nsvalue


【解决方案1】:

我什至没有你做到的那么远。我只在这两行上崩溃了:

let loc = CLLocationCoordinate2D(latitude: 20, longitude: 20)
let val = NSValue(MKCoordinate:loc)

这告诉我NSValue(MKCoordinate:) 坏了。这不是 Swift 的问题。使用翻译成 Objective-C 的相同代码时,我遇到了同样的崩溃。

【讨论】:

  • 如果我是,我们不会编译,对吗?
  • 我只是把它放到我的 viewDidLoad 中并运行,给出的 NSValue 为 .... 怪异:-)
  • 是的,我在不同的运行中也看到了。
  • 那个<00000000 00003440 00000000 00003440> 就是loc。这告诉你我们没有得到一个 NSValue 对象——我们只是得到了原始结构。这解释了你的崩溃。 NSValue 未能像预期的那样包装结构。
  • 我刚刚在 iOS 9 中尝试过这个。我们仍然会因NSValue(MKCoordinate:CLLocationCoordinate2DMake(1,2)) 而崩溃。我也在提交一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多