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

时间:2016-01-18 01:34:10

标签: arrays swift protocols nscoding

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

当我尝试在objects中对ObjectManager的{​​{1}}属性进行编码时,收到错误消息:

encodeWithCoder:

这是我的代码:

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 数组中只有类的实例吗?为什么不能编码?

我还尝试在编码之前将数组转换为NSArray,但是我收到了这个错误:

objects

所以这是我的两个问题:

  1. 如果我使cannot convert value of type '[Object]' to type 'NSArray' in coercion 协议只有对象符合它,那么Object的数组不应该是一个对象数组吗?
  2. 如果由于某种原因问题1是不可能的,那么如何将Object的数组转换为能够使用Object进行编码?

1 个答案:

答案 0 :(得分:2)

您需要将协议声明为@objc,才能将其置于Objective-C世界:

@objc protocol Object: class, NSCoding {

编译器将知道他将能够使用NSArray免费桥接Swift数组,因为您只能使用派生自{的类的实例来构建数组。 {1}}。