我在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, 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<String>(bar: "hello, world")
NSKeyedArchiver.archiveRootObject(foo, 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来解决此问题?
使类成为通用类之后,它就与Objective-C不兼容。NSCoder的所有内容都发生在无法访问您的类的Objective-C中。
请注意,使类通用也有其他后果。例如,如果要添加描述属性,则还会出现编译时错误:
// Error: '@objc' getter for non-'@objc' property
override var description: String {
return "Foo: \(bar)"
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句