泛型 – 如何在Swift的泛型类上实现NSCoding?

泛型 – 如何在Swift的泛型类上实现NSCoding?,第1张

概述我在Swift(XCode beta 5)中遇到泛型类和NSCoding问题.具体来说,这个示例代码很好地工作: class Foo : NSObject, NSCoding{ let bar: String init(bar: String){ self.bar = bar; } func encodeWithCoder(aCoder: NSC 我在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 0x7f8890ee40802014-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' propertyoverrIDe var description: String {    return "Foo: \(bar)"}
总结

以上是内存溢出为你收集整理的泛型 – 如何在Swift的泛型类上实现NSCoding?全部内容,希望文章能够帮你解决泛型 – 如何在Swift的泛型类上实现NSCoding?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1045133.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存