ObjCで以下のようなクラスを書いていたとします。
AAClass.h
#import <Foundation/Foundation.h>
@interface AAClass : NSObject
@property NSString*name;
@end
AAClass.m
#import "AAClass.h"
@implementation AAClass
-(id)init{
if (self = [super init]) {
_name = @""
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:_name forKey:@"name"];
}
- (id)initWithCoder:(NSCoder *)coder {
if (self = [super init]) {
_name = (NSString*)[coder decodeObjectForKey:@"name"];
}
return self;
}
@end
これをswiftに書き換えようとして
import Foundation
class AAClass : NSObject,NSCoding{
var name:String = ""
override init() {
super.init()
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.name, forKey: "name")
}
required init(coder aDecoder: NSCoder) {
self.title = aDecoder.decodeObjectForKey("name") as String
}
}
と書き直します。
処理は同様に行われますが、
ObjCで
[NSKeyedArchiver archivedDataWithRootObject:aaclass]
したものを
swiftで
NSKeyedUnarchiver.unarchiveObjectWithData(aaclass as NSData)
すると、例外エラーを吐いてしまいました。
恐らくObj-Cとswiftのクラス名が同じでも内部的には違うクラスとして扱われているのでしょうか…?
これからObj-CをSwiftに書き直す方は多いと思いますが、NSCodingの部分にはお気をつけ下さい。
#####追記
@satoshia @See_Ku から助言を頂きました。
@objc(AAClass)
class AAClass : NSObject,NSCoding{
~~
のように明示的に指定することで正常に動作しました!!
ありがとうございます