我有一个符合协议StandardObject
的课程Object
。另一个类ObjectManager
有一个名为objects
的属性,它是一个包含Object
实例的数组。 StandardObject
和ObjectManager
都是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
所以这是我的两个问题:
cannot convert value of type '[Object]' to type 'NSArray' in coercion
协议只有对象符合它,那么Object
的数组不应该是一个对象数组吗?Object
的数组转换为能够使用Object
进行编码?答案 0 :(得分:2)
您需要将协议声明为@objc
,才能将其置于Objective-C
世界:
@objc protocol Object: class, NSCoding {
编译器将知道他将能够使用NSArray
免费桥接Swift数组,因为您只能使用派生自{的类的实例来构建数组。 {1}}。