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

ðriim

我在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在泛型类中实现Iterable <>方法

来自分类Dev

如何在泛型类中返回“ this”?

来自分类Dev

如何在Swift 5.1(Xcode 11 Playground)中实现对可选函数的泛型和非泛型函数签名的重载?

来自分类Dev

如何在我子类化的类中的Swift中返回泛型类型

来自分类Dev

在R中,如何在另一个包的类上设置泛型方法?

来自分类Dev

如何在泛型中实现空对象模式?

来自分类Dev

如何在链接列表中实现泛型<E>?

来自分类Dev

如何在Java中实现泛型方法

来自分类Dev

如何在链接列表中实现泛型<E>?

来自分类Dev

如何在C#中的泛型类中使用泛型类的对象?

来自分类Dev

快速实现泛型类中的协议

来自分类Dev

如何在Java中创建泛型类的实例?

来自分类Dev

如何在泛型类中处理可为空的类型

来自分类Dev

如何在C#中遍历泛型类的属性?

来自分类Dev

如何在 Typescript 中做自反泛型类?

来自分类Dev

如何在Swift中实现Singleton类

来自分类Dev

C#如何在泛型类型实现某些类时强制转换类

来自分类Dev

如何在泛型类中返回对象的泛型类型?

来自分类Dev

如何在泛型方法中获取泛型类型的类实例

来自分类Dev

如何在Swift中从带有类型别名的协议中引用具有约束的泛型类?

来自分类Dev

符合Swift中Comparable的泛型类

来自分类Dev

Swift中的多个泛型类继承

来自分类Dev

如何在 Autofac 中将类的特定实现传递给泛型

来自分类Dev

如何在Swift中具有泛型的扩展中使用带有可选类方法的协议?

来自分类Dev

当超类是Swift中的泛型类时,如何继承超类

来自分类Dev

当泛型参数具有多种数据类型时,如何在rust中实现泛型?

来自分类Dev

如何在包含锈特质的泛型类型上实现deref?

来自分类Dev

Java 泛型:如何在泛型接口中获取泛型类的 Id?

来自分类Dev

如何在泛型上添加约束

Related 相关文章

  1. 1

    如何在泛型类中实现Iterable <>方法

  2. 2

    如何在泛型类中返回“ this”?

  3. 3

    如何在Swift 5.1(Xcode 11 Playground)中实现对可选函数的泛型和非泛型函数签名的重载?

  4. 4

    如何在我子类化的类中的Swift中返回泛型类型

  5. 5

    在R中,如何在另一个包的类上设置泛型方法?

  6. 6

    如何在泛型中实现空对象模式?

  7. 7

    如何在链接列表中实现泛型<E>?

  8. 8

    如何在Java中实现泛型方法

  9. 9

    如何在链接列表中实现泛型<E>?

  10. 10

    如何在C#中的泛型类中使用泛型类的对象?

  11. 11

    快速实现泛型类中的协议

  12. 12

    如何在Java中创建泛型类的实例?

  13. 13

    如何在泛型类中处理可为空的类型

  14. 14

    如何在C#中遍历泛型类的属性?

  15. 15

    如何在 Typescript 中做自反泛型类?

  16. 16

    如何在Swift中实现Singleton类

  17. 17

    C#如何在泛型类型实现某些类时强制转换类

  18. 18

    如何在泛型类中返回对象的泛型类型?

  19. 19

    如何在泛型方法中获取泛型类型的类实例

  20. 20

    如何在Swift中从带有类型别名的协议中引用具有约束的泛型类?

  21. 21

    符合Swift中Comparable的泛型类

  22. 22

    Swift中的多个泛型类继承

  23. 23

    如何在 Autofac 中将类的特定实现传递给泛型

  24. 24

    如何在Swift中具有泛型的扩展中使用带有可选类方法的协议?

  25. 25

    当超类是Swift中的泛型类时,如何继承超类

  26. 26

    当泛型参数具有多种数据类型时,如何在rust中实现泛型?

  27. 27

    如何在包含锈特质的泛型类型上实现deref?

  28. 28

    Java 泛型:如何在泛型接口中获取泛型类的 Id?

  29. 29

    如何在泛型上添加约束

热门标签

归档