gpt4 book ai didi

objective-c - 如何将 NSDictionary 转换为 Swift Dictionary

转载 作者:IT王子 更新时间:2023-10-29 05:13:25 28 4
gpt4 key购买 nike

我正在用 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 overload for init接受提供的参数。” 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>

由于您使用 Cocoa Touch 进​​行序列化和反序列化,因此它们被序列化为 NSDictionary , 但您可以将其转换为 Swift Dictionary<,> ,根据 WWDC 2014 Intermediary SwiftAdvanced Swift 视频。

你也可以解码为NSDictionary然后像这样显式地转换对象:

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

基本上,您在这里玩的是协变/逆变。

关于objective-c - 如何将 NSDictionary 转换为 Swift Dictionary<String, NSObject>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24099165/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com