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
实例的数组。 StandardObject
和 ObjectManager
都是 NSObject
的子类并符合 NSCoding
。
当我尝试在encodeWithCoder:
中编码ObjectManager
的objects
属性时,我收到一个错误:
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 和 Objective-C 之间共享协议的类方法?