23
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ObjCからSwiftに書きなおす際にNSCodingがうまく動かない(解決済)

Last updated at Posted at 2014-09-11

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{
~~

のように明示的に指定することで正常に動作しました!!
ありがとうございます

23
21
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?