Копировать конструктор и ошибка «Невозможно вызвать значение нефункционального типа» - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть базовый класс 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'

Два вопроса: что я делаю не так? и есть ли более простой способ создать конструктор копирования, включающий подклассы?

1 Ответ

0 голосов
/ 19 февраля 2020

Попробуйте шаблон прототипа:

     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()
...