Tôi đang viết lại lớp Objective-C trong Swift để cảm nhận ngôn ngữ. Trong Objective-C lớp học của tôi bao gồm các phương pháp sau đây:Làm cách nào để chuyển đổi từ điển NSD sang từ điển Swift <String, NSObject>?
- (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"]];
}
Sau một số thử và sai với trình biên dịch, tôi cố gắng viết lại nó như thế này:
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)
}
Tuy nhiên, đây vẫn mang lại cho tôi một lỗi trên dòng cuối cùng: “không thể tìm thấy một tình trạng quá tải cho init
chấp nhận các đối số cung cấp” phương pháp chữ ký của init
là
init(actionName: String, payload: Dictionary<String, NSObject>, timestamp: NSDate)
vì vậy tôi cho rằng vấn đề là tôi đang cố gắng chuyển một số NSDictionary
thay vì Dictionary<String, NSObject>
. Làm cách nào tôi có thể chuyển đổi giữa hai loại không tương đương này? Tôi có nên chỉ sử dụng NSDictionary
cho tất cả mã có tương tác với các thành phần Objective-C khác không?
Xin lỗi vì sự nhầm lẫn — vì tôi đã viết lại lớp, tôi đã quyết định tinh chỉnh API cùng một lúc. Thứ tự của các đối số cho phương thức Swift là chính xác, do đó, đó không phải là vấn đề. Tôi đã chỉnh sửa câu hỏi để thay đổi thứ tự của các đối số trong phiên bản ObjC để không có nhầm lẫn. – bdesham