在Swift中在init之外实例化Self

时间:2017-03-12 17:18:33

标签: swift initialization creation

我想创建一个类,以便在调用函数a之后它的子类将接收一个Self类型的新对象。我在保证,子类将具有init()方法。

在某种程度上我想要克隆对象,但实际上它不止于此,因为我想创建一个具有原始修改值的克隆,所以我真的不想使用swifty copy构造函数语法

为什么它不起作用?绝对是这样的:

func myCustomCopy(modificationCommand: Command) -> Test {
    let newInt = modificationCommand.execute(self.myInt)
    return Test(newInt: newInt)
}

不是我想要的。

示例:

protocol Testable {
    var myInt: Int { get set }
    init(newInt: Int)
}

class Test: Testable {
    var myInt = 10
    required init(newInt: Int) { myInt = newInt }

    func myCustomCopy(modificationCommand: Command) -> Self {
        let newInt = modificationCommand.execute(self.myInt)
        return self.init(newInt: newInt)
    }
}

1 个答案:

答案 0 :(得分:1)

您可以使用type(of:)返回的(动态类型)元类型来访问元类型具体类型的初始值设定项。引用Language Reference - Metatypes

  

使用初始化表达式构造一个类型的实例   该类型的元类型值。对于类实例,初始化程序   被调用的必须使用required关键字或整个关键字进行标记   标有最终关键字的类。

因此,在您的情况下,您可以使用self的元型来调用具体类型required的{​​{1}}初始值设定项,例如

self

请注意,正如上面引用中所述,由于您正在使用非final类,因此初始值设定项必须为func myCustomCopy() -> Self { return type(of: self).init() }