Swift 和 NSCoding:对符合类协议的对象数组进行编码

Posted

技术标签:

【中文标题】Swift 和 NSCoding:对符合类协议的对象数组进行编码【英文标题】:Swift and NSCoding: Encoding an array of objects conforming to a class-only protocol 【发布时间】:2016-01-18 01:34:10 【问题描述】:

我有一个类StandardObject,它符合Object 协议。另一个类ObjectManager 有一个名为objects 的属性,它是一个包含Object 实例的数组。 StandardObjectObjectManager 都是 NSObject 的子类并符合 NSCoding

当我尝试在encodeWithCoder: 中编码ObjectManagerobjects 属性时,我收到一个错误:

cannot convert value of type '[Object]' to expected argument type 'AnyObject?'

这是我的代码:

ObjectManager:

class ObjectManager: NSObject, NSCoding 

    var objects = [Object]()

    required init?(coder aDecoder: NSCoder) 

    

    func encodeWithCoder(aCoder: NSCoder) 
        aCoder.encodeObject(objects, forKey: "Objects") //// ERROR HERE
    


Object协议:

protocol Object: class, NSCoding 
    // Currently completely empty

StandardObject:

class StandardObject: NSObject, Object 

    required init?(coder aDecoder: NSCoder) 

    

    func encodeWithCoder(aCoder: NSCoder) 

    


我知道这与您只能编码对象(或它们的数组)这一事实有关,而不能编码结构、枚举,或者在这种情况下是协议。但是,Object 协议的声明是:

protocol Object: class, NSCoding

这意味着只有类才能符合这个协议。

这不应该意味着objects 数组中只有类的实例吗?为什么不能编码?

我也尝试在编码之前将数组转换为 NSArray,但出现此错误:

cannot convert value of type '[Object]' to type 'NSArray' in coercion

所以这是我的两个问题:

    如果我让Object 协议只有符合它的对象,那么Object 的数组不应该是对象数组吗? 如果问题 1 由于某种原因无法实现,如何将 Object 的数组转换为能够使用 NSCoding 进行编码?

【问题讨论】:

【参考方案1】:

您需要将您的协议声明为@objc,以将其放入Objective-C 世界:

@objc protocol Object: class, NSCoding 

然后编译器将知道他将能够免费桥接 Swift 数组与 NSArray,因为您将能够仅使用派生自 NSObject 的类的实例来构建数组。

【讨论】:

以上是关于Swift 和 NSCoding:对符合类协议的对象数组进行编码的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的简单对象符合 Swift 中的 NSManagedObject 和 NSCoding

使 swift 类符合协议 - 在静态/类级别

Swift,NSCoding 保存类的数组不起作用

如何创建符合 Swift 和 Objective-C 之间共享协议的类方法?

无法将符合协议的 Objective-C 类分配给具有 Swift 协议的属性

来自符合协议的未知类的 Swift init