bde*_*ham 19 cocoa-touch objective-c swift
我正在重写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"]];
}
Run Code Online (Sandbox Code Playgroud)
在使用编译器进行一些试验和错误之后,我设法将其重写为:
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)
}
Run Code Online (Sandbox Code Playgroud)
但是,这仍然在最后一行给出了一个错误:"找不到init接受提供的参数的重载."方法签名init是
init(actionName: String, payload: Dictionary<String, NSObject>, timestamp: NSDate)
Run Code Online (Sandbox Code Playgroud)
所以我认为问题是我试图传递NSDictionary而不是Dictionary<String, NSObject>.如何在这两种不完全等效的类型之间进行转换?我是否应该只使用NSDictionary所有必须与其他Objective-C组件交互的代码?
Leo*_*ica 14
将字典解码为Dictionary<String, NSObject>而不是NSDictionary.
let payload = aDecoder.decodeObjectOfClass(NSDictionary.self, forKey: "payload") as! Dictionary<String, NSObject>
Run Code Online (Sandbox Code Playgroud)
由于您使用Cocoa Touch进行序列化和反序列化,因此它们被序列化为NSDictionary,但您可以Dictionary<,>根据WWDC 2014 Intermediary Swift和Advanced Swift视频将其投射到Swift.
你也可以解码为NSDictionary然后显式地转换对象,如下所示:
self.init(actionName: actionName, payload: payload as! Dictionary<String, NSObject>, timestamp: timestamp)
Run Code Online (Sandbox Code Playgroud)
基本上,你在这里玩协方差/逆变.
| 归档时间: |
|
| 查看次数: |
16167 次 |
| 最近记录: |