【问题标题】:NSNumber swift Dictionary to userdefaults swift3NSNumber swift Dictionary to userdefaults swift3
【发布时间】:2017-08-01 10:37:24
【问题描述】:

我正在尝试将 swift 字典 [NSNumber : NSNumber] 保存到 UserDefaults。我已经尝试将其转换为 NSDictinonary,但是当我使用 set() 函数时,应用程序仍然崩溃。

Key 是一个信标次要密钥(NSNumber) 值是 NSTimeinterval 转换为 NSNumber

崩溃:

libc++abi.dylib:以未捕获的类型异常终止 NSException

var  recentBeacons: [NSNumber : NSNumber] = [:]

func saveRecentBeaconDict()
{
    let recentBeaconKeys = recentBeacons.keys
    print("keys type is \(String(describing: recentBeaconKeys.self))")

    let recentBeaconsNSDict = recentBeacons as NSDictionary
    UserDefaults.standard.set(recentBeaconsNSDict, forKey:"recentBeacons")
}

打印出来:键类型是 LazyMapCollection, NSNumber >(_base: [46171: 1501585588.173543], _transform: (Function))

【问题讨论】:

  • 分享一些你尝试过的代码。
  • 异常原因是什么?
  • @vadian 异常原因就在源代码上方的 O.P. 的原始问题中。
  • 我认为最终的问题是因为键或值都 不是 O.P. 认为的类型。尝试执行类似let recentBeaconKeys = recentBeacons.keys ; print("keys type is \(String(describing: recentBeaconKeys.self))")" 的操作并告诉我键(或值)的真正类型。`
  • @MichaelDautermann 不,这是发生异常但不包含原因的消息。

标签: swift dictionary nsuserdefaults nsnumber


【解决方案1】:

试试下面的答案。

    var  recentBeacons: [NSNumber : NSNumber] = [:]
    func saveRecentBeaconDict()
    {
        let archivedObject = NSKeyedArchiver.archivedData(withRootObject: recentBeacons as NSDictionary)
        UserDefaults.standard.set(archivedObject, forKey: "recentBeacons")

        let data = UserDefaults.standard.object(forKey: "recentBeacons") as? Data
        if let _data = data {

            let allData = NSKeyedUnarchiver.unarchiveObject(with: _data) as! NSDictionary
            print(allData)
        }
    }

【讨论】:

    【解决方案2】:

    您不能保存 [NSNumber : NSNumber] 类型的字典,只允许 [String, AnyObject] 或 [NSObject : AnyObject]。

    作为方法,您可以将您的 NSNumber's 转换为 String's

    【讨论】:

    • I believe you can use NSNumbers as keys,塔拉斯。您可能正在考虑原始 C 类型,例如 ints
    • @MichaelDautermann 是的,你可以使用NSNumber 作为Dictionary 的键,但是你不能使用[NSNumber : NSNumber] 作为NSUserDefaults 的对象
    猜你喜欢
    • 1970-01-01
    • 2018-10-03
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    相关资源
    最近更新 更多