Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何将NSD字典转换为Swift字典<;字符串,NSObject>;?_Objective C_Cocoa Touch_Swift - Fatal编程技术网

Objective c 如何将NSD字典转换为Swift字典<;字符串,NSObject>;?

Objective c 如何将NSD字典转换为Swift字典<;字符串,NSObject>;?,objective-c,cocoa-touch,swift,Objective C,Cocoa Touch,Swift,我正在用Swift重写一个Objective-C类,以便对该语言有所了解。在Objective-C中,我的课程包括以下方法: - (id) initWithCoder:(NSCoder *)aDecoder { return [self initWithActionName:[aDecoder decodeObjectOfClass:[NSString class] forKey:@"actionName"] payload:[aD

我正在用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)
}
但是,这仍然在最后一行给了我一个错误:“找不到接受提供的参数的
init
的重载。”

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

所以我假设问题是我试图传递的是
NSDictionary
,而不是
Dictionary
。如何在这两种不完全相同的类型之间进行转换?我是否应该对所有必须与其他Objective-C组件交互的代码使用
NSDictionary
?参数顺序与您在Objective-C代码中调用的顺序不同


因此,如果需要精确的重新实现,最后一个调用可能应该是
self.init(actionName:actionName,timestamp:timestamp,payload:payload)
。使用错误的参数顺序调用初始值设定项将导致您收到的错误消息。

将词典解码为
词典
,而不是
NSDictionary

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

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

很抱歉造成混淆,因为我在重写类的同时决定调整API。Swift方法的参数顺序是正确的,所以这不是问题所在。我已经编辑了这个问题,以改变ObjC版本中参数的顺序,这样就不会出现混淆。
self.init(actionName: actionName, payload: payload as! Dictionary<String, NSObject>, timestamp: timestamp)