在Swift中实例化泛型类型的对象

knl*_*knl 13 generics swift

我正在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单击常量名称时.

有任何想法吗?:)

Sae*_* N. 6

将类init标记为required,然后调用init:

class SuperBar {
    required init() {
    }
}


class Foo<T: SuperBar> {

    func instantiateObject() -> T {
        return T.init()
    }

} 
Run Code Online (Sandbox Code Playgroud)


new*_*cct 5

如果添加required init() { }SuperBar,它工作正常.无论如何都应该始终要求该要求,因为您正在从变量类创建实例.

它允许您使用不需要的初始化程序创建它是一个错误.