我想创建一个类,以便在调用函数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)
}
}
答案 0 :(得分:1)
您可以使用type(of:)
返回的(动态类型)元类型来访问元类型具体类型的初始值设定项。引用Language Reference - Metatypes
使用初始化表达式构造一个类型的实例 该类型的元类型值。对于类实例,初始化程序 被调用的必须使用
required
关键字或整个关键字进行标记 标有最终关键字的类。
因此,在您的情况下,您可以使用self
的元型来调用具体类型required
的{{1}}初始值设定项,例如
self
请注意,正如上面引用中所述,由于您正在使用非final类,因此初始值设定项必须为func myCustomCopy() -> Self {
return type(of: self).init()
}
。