使用继承时,Swift Generics不会实例化泛型

时间:2014-11-04 01:02:44

标签: ios xcode generics swift

我有课程AlphaBerry

class Alpha { }
class Berry : Alpha { }

我有一个在其中使用继承的函数:

func myFunc<T : Alpha>(v:T) -> T {
    return T()
}

我这样调用myFunc:

myFunc(Berry())

在我的项目中,返回的对象是Alpha类型,而不是类型Berry。这是编译器中的错误,或者这只是我对泛型的误解吗?

1 个答案:

答案 0 :(得分:3)

您要实现的目标是传递Berry实例并获取Berry的另一个实例?

如果是这样,以下代码应该有效:

class Alpha {

    required init() { } // ← YOU NEED THIS

    func printme() {
        println("I'm alpha")
    }
}
class Berry : Alpha {
    override func printme() {
        println("I'm berry")
    }
}

func myFunc<T:Alpha>(v:T) -> T {
    return v.dynamicType()
}
// This also works:
/*
func myFunc<T: Alpha>(v:T) -> T {
    return (T.self as T.Type)()
}
*/

let a = myFunc(Berry())
a.printme() // -> I'm berry

required init() { }是确保从Alpha派生的所有类都具有init()初始化程序所必需的。 这是相关的问答:Swift generics not preserving type

如果您要将Berry作为类型传递并获取Berry的新实例,请尝试以下操作:

class Alpha {
    required init() { }
    func printme() {
        println("alpha")
    }
}
class Berry : Alpha {
    override func printme() {
        println("berry")
    }
}

func myFunc<T:Alpha>(v:T.Type) -> T {
    return v()
}

let a = myFunc(Berry)
a.printme()