如何将NSD字典转换为SWIFT字典<String,NSObject>?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (87)

我正在用SWIFT重写一个Objective-C类。在Objective-C中,我的类包括以下方法:

- (id) initWithCoder:(NSCoder *)aDecoder
{
    return [self initWithActionName:[aDecoder decodeObjectOfClass:[NSString class] forKey:@"actionName"]
                            payload:[aDecoder decodeObjectOfClass:[NSDictionary class] forKey:@"payload"]
                          timestamp:[aDecoder decodeObjectOfClass:[NSDate class] forKey:@"timestamp"]];
}

在对编译器进行了一些尝试和错误之后,我成功地重写了它,如下所示:

convenience init(aDecoder: NSCoder) {
    let actionName = aDecoder.decodeObjectOfClass(NSString.self, forKey: "actionName") as NSString
    let payload = aDecoder.decodeObjectOfClass(NSDictionary.self, forKey: "payload") as NSDictionary
    let timestamp = aDecoder.decodeObjectOfClass(NSDate.self, forKey: "timestamp") as NSDate
    self.init(actionName: actionName, payload: payload, timestamp: timestamp)
}

然而,这仍然给了我最后一行的一个错误:“Could not find an overload for init that accepts the supplied arguments.“。init的方法签名是

init(actionName: String, payload: Dictionary<String, NSObject>, timestamp: NSDate)

所以我假设问题是我正在尝试传递一个NSDictionary而不是Dictionary <String,NSObject>。 我怎样才能在这两个不太相当的类型之间进行转换? 我是否应该使用NSDictionary来处理所有必须与其他Objective-C组件交互的代码?

提问于
用户回答回答于

将你的字典解码为Dictionary<String, NSObject>而不是NSDictionary...

let payload = aDecoder.decodeObjectOfClass(NSDictionary.self, forKey: "payload") as! Dictionary<String, NSObject>

因为使用CocoaTouch来序列化和反序列化,所以它们被序列化为NSDictionary,但你可以把它投给swiftDictionary<,>,根据WWDC 2014中介SWIFT高级SWIFT录像。

也可以解码为NSDictionary然后显式地转换对象,如下所示:

self.init(actionName: actionName, payload: payload as! Dictionary<String, NSObject>, timestamp: timestamp)

基本上,你在这里玩的是协方差/反方差。

用户回答回答于

你确定这是init的正确声明吗?参数顺序与您在目标C代码中调用的参数顺序不同。

因此,如果想要精确的重新实现,最后一次调用应该是self.init(actionName: actionName, timestamp: timestamp, payload: payload)使用错误的参数顺序调用初始化程序将导致得到错误消息。

扫码关注云+社区

领取腾讯云代金券