2015-11-30 4 views
2

У меня есть два разных приложения (одно из них написано в 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]; 

Любые идеи, как исправить ошибку?

ответ

0

Хорошо, после некоторого дополнительного копания я нашел ответ. Мне пришлось объявить имя класса Objective-C в классе swift, например:

@objc(Favourite) 
class Favourite: NSObject, NSCoding { 
    // and so on.. 

Это устранило проблему.

Смежные вопросы