我在Swift(XCode beta 5)中遇到泛型类和NSCoding问题.具体来说,这个示例代码很好地工作:
class Foo : NSObject,NSCoding { let bar: String init(bar: String){ self.bar = bar; } func encodeWithCoder(aCoder: NSCoder!){ aCoder.encodeObject(bar,forKey: "bar") } required init(coder aDecoder: NSCoder!){ self.bar = aDecoder.decodeObjectForKey("bar") as String super.init() } } let foo = Foo(bar: "hello,world") NSKeyedArchiver.archiveRootObject(foo,toFile: "test.dat")
但是,当我尝试相同的代码,并添加一个泛型参数;当我尝试编码对象;我收到一个’无法识别的选择器发送到实例’错误:
class Foo<T> : NSObject,forKey: "bar") } required init(coder aDecoder: NSCoder!){ self.bar = aDecoder.decodeObjectForKey("bar") as String super.init() } } let foo = Foo<String>(bar: "hello,toFile: "test.dat")
以下是错误详细信息和堆栈跟踪:
[_TtC6SafeId14ArrayContainer00007F8893418E58 encodeWithCoder:]: unrecognized selector sent to instance 0x7f8890ee4080 2014-08-16 10:43:54.632 SafeId[1778:32501] *** Terminating app due to uncaught exception 'NSInvalidArgumentException',reason: '-[_TtC6SafeId14ArrayContainer00007F8893418E58 encodeWithCoder:]: unrecognized selector sent to instance 0x7f8890ee4080' *** First throw call stack: ( 0 CoreFoundation 0x0000000103a6e3e5 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x000000010371e967 objc_exception_throw + 45 2 CoreFoundation 0x0000000103a754fd -[NSObject(NSObject) doesNotRecognizeSelector:] + 205 3 CoreFoundation 0x00000001039cd5ff ___forwarding___ + 495 4 CoreFoundation 0x00000001039cd388 _CF_forwarding_prep_0 + 120 5 Foundation 0x00000001032eaa75 _encodeObject + 1120 6 Foundation 0x0000000103326bf5 +[NSKeyedArchiver archiveRootObject:toFile:] + 241
当我读到这一点,当类是通用的时,Swift无法调用encodeWithCoder的实现.它是否正确 ?为了在泛型类上使用NSCoding,我该如何解决这个问题?