У меня есть два разных приложения (одно из них написано в Objective-C, одно в Swift), которые делят некоторые данные. Я решил выполнить синхронизацию через iCloud. Элементы, которые нужно синхронизировать, упаковываются в массив и затем сохраняются в файле. Все работает, как и ожидалось, при синхронизации приложения Objective-C, но я получаю следующее сообщение об ошибке, когда я пытаюсь загрузить файл в Swift приложение:Ошибка при распаковке объектов из файла iCloud
, истекающий приложение из-за неперехваченного исключением «NSInvalidUnarchiveOperationException», причина: '*** - [NSKeyedUnarchiver decodeObjectForKey:]: не может декодировать объект класса (Favorite) для ключа (NS.objects); класс может быть определен в исходном коде или библиотеки, которая не связана»
Вот как Favourite
классы:
Objective C:
@interface Favourite : NSObject
@property(retain,nonatomic) NSString* mArtikeltext;
@property(retain,nonatomic) NSString* mRid;
-(instancetype) initWithObject:(NSMutableDictionary*) object;
@end
.m:
@implementation Favourite
-(instancetype) initWithObject:(NSMutableDictionary *)object{
self = [super init];
if(self){
self.mArtikeltext = [object valueForKey:@"mArtikeltext"];
self.mRid = [object valueForKey:@"mRid"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *) coder
{
[coder encodeObject:self.mArtikeltext forKey:@"mArtikeltext"];
[coder encodeObject:self.mRid forKey:@"mRid"];
}
- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
self.mArtikeltext = (NSString *)[decoder decodeObjectForKey:@"mArtikeltext"];
self.mRid = (NSString *)[decoder decodeObjectForKey:@"mRid"];
}
return self;
}
@end
Свифт:
class Favourite: NSObject, NSCoding {
var mArtikeltext: String = ""
var mRid: String = ""
init(object: [String: AnyObject]) throws {
super.init()
guard case let (text as String, rid as String) = (object["mArtikelText"], object["mRid"]) else {
throw JSONResponseError.NilResponseValue
}
self.mArtikeltext = text
self.mRid = rid
}
required init?(coder aDecoder: NSCoder) {
super.init()
self.mArtikeltext = aDecoder.decodeObjectForKey("mArtikeltext") as! String
self.mRid = aDecoder.decodeObjectForKey("mRid") as! String
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.mArtikeltext, forKey: "mArtikeltext")
aCoder.encodeObject(self.mRid, forKey: "mRid")
}
}
Это, как я разархивировать данные в Swift:
let cloudFavs: [Favourite] = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! [Favourite]
и Objective-C:
NSArray *favs = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Любые идеи, как исправить ошибку?