• 主页
  • 深度复制数组,其中元素是可选的自定义类

深度复制数组,其中元素是可选的自定义类

首先:我不能在我的场景中使用结构。我知道结构默认是“按值传递”的。但在我的例子中,我真的需要类对象的“按引用传递”语义。

正如标题所说,我正在尝试深度复制一个数组,它包含一个自定义类的可选对象。

对于自定义类对象的深层副本,我实现了以下协议:

protocol Copyable {
    init(instance: Self)
}

extension Copyable {
    func copy() -> Self {
        return Self.init(instance: self)
    }
}

现在,我也有了需要进行深度复制的自定义类对象数组。为了实现这一点,我为Array编写了一个扩展,其中Element是Copyable,它看起来像这样,并且正在运行:

extension Array where Element: Copyable {
    func clone() -> Array {
        var copiedArray = Array<Element>()
        for element in self {
            copiedArray.append(element.copy())
        }
        return copiedArray
    }
}

假设我有两个自定义类。第一个已经符合Copyable,如下所示:

class MySimpleObject: Copyable {

    let myString: String

    init() {
        self.myString = ""
    }

    required init(instance: MySimpleObject) {
        self.myString = instance.myString
    }
}

现在,我的第二个自定义类包含两个MySimpleObject数组(一个元素为MySimpleObject的数组是非可选的,一个元素为MySimpleObject的数组是可选的。这个类看起来像这样:

class MyObject {

    var myArray = [MySimpleObject]()
    var myArrayWithOptionals = [MySimpleObject?]()
}

现在我想让MyObject符合Copyable,这就是让我困惑的地方。首先,我尝试这样做(但这会给我一个错误,如注释中所示:

class MyObject: Copyable {

    var myArray = [MySimpleObject]()
    var myArrayWithOptionals = [MySimpleObject?]()

    required init(instance: MyObject) {
        self.myArray = instance.myArray.clone()
        self.myArrayWithOptionals = instance.myArrayWithOptionals.clone()       // Type 'MySimpleObject?' does not conform to protocol 'Copyable'
    }
}

这个错误对我来说是有意义的。因为MySimpleObject?不等于MySimpleObject

我的第二次尝试是为Array编写另一个扩展,但我不确定如何以正确的方式完成此操作:

extension Array where Element == Optional<Copyable> {
    func cloneOptional() -> Array {
        var copiedArray = Array<Element>()
        for element in self {
            copiedArray.append(element?.copy())
        }
        return copiedArray
    }
}

MyObject看起来像这样:但是我也得到了一个错误(同样显示在评论中)

class MyObject: Copyable {

    var myArray = [MySimpleObject]()
    var myArrayWithOptionals = [MySimpleObject?]()

    required init(instance: MyObject) {
        self.myArray = instance.myArray.clone()
        self.myArrayWithOptionals = instance.myArrayWithOptionals.cloneOptional()   // '[MySimpleObject?]' is not convertible to 'Array<Optional<Copyable>>'
    }
}

有人能给我提示一下我需要的方向吗?我们如何以正确的方式实现这一点?

如果你需要更多的信息,请在评论中告诉我。

诚挚的问候,

Teetz

转载请注明出处:http://www.jubohx.com/article/20230522/2586685.html