首页 > 解决方案 > 复制构造函数和“无法调用非函数类型的值”错误

问题描述

我有一个基类 A 和三个子类:

class A {}
class X : A {}
class Y : A {}
class Z : A {}

在我的代码中,我有一个实例m,我想创建一个相同类型的副本。我可以成功使用以下代码:

        let n = type(of: m).init(m)
... and in class A: 
        required init(m : A) {
           self.param1 = m.param1 

我尝试通过在 A 类中创建一个复制构造函数来简化事情:

   func copy() {
      return type(of: self).init(self)
   }

但此声明会产生错误:无法调用非函数类型“AType”的值

两个问题:我做错了什么?是否有更简单的方法来创建涉及子类的复制构造函数?

标签: swiftcopy-constructor

解决方案


尝试原型设计模式:

     public protocol Copying: class {

    init(_ prototype: Self)
}

extension Copying {
    public func copy() -> Self {
        return type(of: self).init(self)
    }
}

public class A: Copying {

    public var value1: Int
    public var value2: Int

    public init(value1: Int, value2: Int) {
        self.value1 = value1
        self.value2 = value2
    }

    public required convenience init(_ a: A) {
        self.init(value1: a.value1, value2: a.value2)
    }
}

你可以像这样使用它:

let a = A(value1: 700, value2: 37)

let aCopy = a.copy()

推荐阅读