【问题标题】:Cannot invoke 'unarchiveObject' with an argument list of type '(ofClasses: [NSObject.Type], from: Data)'无法使用类型为“(ofClasses:[NSObject.Type],来自:Data)”的参数列表调用“unarchiveObject”
【发布时间】:2020-10-08 04:52:51
【问题描述】:

根据 Vadian 的回答 How to NSKeyedUnarchiver.unarchiveObject 将弃用的 NSKeyedUnarchiver.unarchiveObject 转换为在 Swift 5/iOS 12+ 中工作

我设法将存档部分转换为工作,但我仍然无法修复未存档部分,这是我的代码:

override func viewDidDisappear(_ animated: Bool)
{
    super.viewDidDisappear(animated)
    guard let packs = MGLOfflineStorage.shared.packs else { return }
    for pack in packs
    {
        do
        {
            let userInfo = try? NSKeyedUnarchiver.unarchiveObject(ofClasses: [NSObject.self], from: pack.context) as? [String: String]
            print("Suspending download of offline pack: “\(userInfo["name"] ?? "unknown")”")
        }
        catch
        {
            print("viewDidDisappear: KeyedUnarchiver Error")
        }
        pack.suspend()
    }
}

这给了我一个错误:

无法使用类型为“(ofClasses: [NSObject.Type], from: Data)”的参数列表调用“unarchiveObject”

这是原来的 iOS 12- 代码:

override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)

// When leaving this view controller, suspend offline downloads.
guard let packs = MGLOfflineStorage.shared.packs else { return }
for pack in packs {
if let userInfo = NSKeyedUnarchiver.unarchiveObject(with: pack.context) as? [String: String] {
print("Suspending download of offline pack: “\(userInfo["name"] ?? "unknown")”")
}
pack.suspend()
}
}

【问题讨论】:

  • NSObject 是一个抽象的 Objective-C 基类。你必须更具体。显然context 包含一个[String:String] 字典,所以至少使用NSDictionary
  • 谢谢 vadian,我对这个有点不熟悉,我试过了,但仍然得到同样的错误。你能告诉我在这种情况下你将如何解决它。

标签: swift mapbox nskeyedarchiver nskeyedunarchiver mapbox-ios


【解决方案1】:

尝试以下操作:

let userInfo = try? NSKeyedUnarchiver.unarchiveObject(ofClasses: [NSObject.self.classForKeyedUnarchiver()], from: pack.context) as? [String: String]  

但是,在下面的objective-c中可以工作:

NSSet *allowedClasses = [NSSet setWithObjects:[NSArray class],[NSMutableDictionary class], nil];
NSData *eObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"Key"];
NSArray *dUuidList = [NSKeyedUnarchiver unarchivedObjectOfClasses:allowedClasses fromData:eObject error:&error];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多