草庐IT

arrays - swift 和 NSCoding : Encoding an array of objects conforming to a class-only protocol

coder 2023-09-15 原文

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

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

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

所以这是我的两个问题:

  1. 如果我让 Object 协议(protocol)只有符合它的对象,那么 Object 数组不应该是对象数组吗?
  2. 如果问题 1 由于某种原因无法解决,您如何将 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/

有关arrays - swift 和 NSCoding : Encoding an array of objects conforming to a class-only protocol的更多相关文章

随机推荐