我正在FooSwift中实现一个类,它应该实例化给定子类的对象SuperBar,例如Bar: SuperBar.我非常喜欢Swift中的泛型,所以我试着用这种方式实现它:
class Foo<T: SuperBar> {
func instantiateObject() -> T {
return T()
}
}
class SuperBar {
}
class Bar: SuperBar {
}
let foo = Foo<Bar>()
let obj = foo.instantiateObject()
Run Code Online (Sandbox Code Playgroud)
您可以在Xcode Playground中运行代码片段并观察它obj是类型SuperBar而不是Bar,虽然它说Bar我在Alt单击常量名称时.
有任何想法吗?:)
将类init标记为required,然后调用init:
class SuperBar {
required init() {
}
}
class Foo<T: SuperBar> {
func instantiateObject() -> T {
return T.init()
}
}
Run Code Online (Sandbox Code Playgroud)
如果添加required init() { }到SuperBar,它工作正常.无论如何都应该始终要求该要求,因为您正在从变量类创建实例.
它允许您使用不需要的初始化程序创建它是一个错误.