从iCloud文件取消配置对象时出错



我有两个不同的应用程序(一个用Objective-C编写,一个用Swift编写),它们共享一些数据。我决定通过iCloud进行同步。要同步的项目被打包在一个数组中,然后保存到一个文件中。在同步Objective-C应用程序时,一切都如预期,但当我尝试在Swift应用程序中下载文件时,我收到了以下错误:

由于未捕获的异常"NSInvalidUnarchiveOperationException"而终止应用程序,原因:"***-[NSKeyedUnarchiver decodeObjectForKey:]:无法为密钥(NS.objects)解码类(Favourite)的对象;类可以在源代码中定义,也可以在未链接的库中定义

以下是两个Favourite类:

目标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

Swift:

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];

有什么办法解决这个错误吗?

好的,经过进一步的挖掘,我找到了答案。我必须在swift类中声明Objective-C类名,如下所示:

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

这解决了问题。

最新更新