我有一个类 StandardObject,它符合 Object 协议(protocol)。另一个类 ObjectManager 有一个名为 objects 的属性,它是一个包含 Object 实例的数组。 StandardObject 和ObjectManager 都是NSObject 的子类并且符合NSCoding。
当我尝试在 encodeWithCoder: 中对 ObjectManager 的 objects 属性进行编码时,我收到一个错误:
cannot convert value of type '[Object]' to expected argument type 'AnyObject?'
这是我的代码:
对象管理器:
class ObjectManager: NSObject, NSCoding {
var objects = [Object]()
required init?(coder aDecoder: NSCoder) {
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(objects, forKey: "Objects") //// ERROR HERE
}
}
对象协议(protocol):
protocol Object: class, NSCoding {
// Currently completely empty
}
标准对象:
class StandardObject: NSObject, Object {
required init?(coder aDecoder: NSCoder) {
}
func encodeWithCoder(aCoder: NSCoder) {
}
}
我知道这与您只能对对象(或它们的数组)进行编码这一事实有关,而不能对结构、枚举或在本例中的协议(protocol)进行编码。但是,Object 协议(protocol)的声明是:
protocol Object: class, NSCoding
这意味着只有类才能符合这个协议(protocol)。
这不应该意味着 objects 数组中只有类的实例吗?为什么不能编码?
我也曾尝试在编码前将数组转换为 NSArray,但出现此错误:
cannot convert value of type '[Object]' to type 'NSArray' in coercion
所以这是我的两个问题:
Object 协议(protocol)只有符合它的对象,那么 Object 数组不应该是对象数组吗?Object 数组转换为能够使用 NSCoding 进行编码?最佳答案
您需要将您的协议(protocol)声明为@objc,以便将其放入Objective-C 世界:
@objc protocol Object: class, NSCoding {
然后编译器将知道他将能够使用 NSArray 免费桥接 Swift 数组,因为您将能够仅使用从派生的类的实例构建数组NSObject.
关于arrays - swift 和 NSCoding : Encoding an array of objects conforming to a class-only protocol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34845987/