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

标签 generics swift xcode6 xcode6-beta5

我在使用 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)"
}

关于generics - 如何在 Swift 中的泛型类上实现 NSCoding?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25338484/

相关文章:

objective-c - 使用尺寸等级时无法加载 View

java - 通用数组创建错误

c# - C# 中更复杂的扩展泛型

ios - 使用导航 Controller 在 `prepareForSegue` 中设置数据

xcode6 - XCode 6 编辑器和转义键

objective-c - 转换为现代 Objective-C 语法 - 单个文件?

java - Collection 类型不是通用的;它不能用参数参数化 <?扩展 E>

Swift:返回受泛型类型约束的类

swift - iBeacon:更快获取广告包

ios - 如何在保持堆栈 View 存在的同时以图形方式隐藏 View ?