Я переписываю класс Objective-C в Swift, чтобы понять язык. В 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
равна
init(actionName: String, payload: Dictionary<String, NSObject>, timestamp: NSDate)
поэтому я предполагаю, что проблема заключается в том, что я пытаюсь передать NSDictionary
вместо Dictionary<String, NSObject>
. Как я могу конвертировать между этими двумя не совсем эквивалентными типами? Должен ли я использовать NSDictionary
для всего кода, который должен взаимодействовать с другими компонентами Objective-C?