Swift泛型继承自另一种泛型类型

时间:2016-06-06 15:48:54

标签: swift generics

我正在尝试让以下代码在游乐场中工作:

public protocol SomeTypeProtocol {
    associatedtype T
    func convertTo<TNew:SomeTypeProtocol>()-> TNew
}

public class SomeClass<T>: SomeTypeProtocol{

    var item:T
    public init(item:T)
    {
        self.item = item
    }
    public func convertTo<TNew:SomeTypeProtocol where TNew.T : T>()-> TNew
    {
        return SomeClass<TNew.T>(item: item  as! TNew.T)
    }
}

基本上,我有一个带有关联类型T的协议,以及一个符合该协议的类,通用类型为T,我需要实现convertTo函数,它只是将类的类型T转换为另一个类型TNew.T是T的子类 我用C#和Java等其他语言实现了这个,所以我不确定为什么我不能在Swift中使用它。 我收到以下错误:

1) error: type 'TNew.T' constrained to non-protocol type 'T'
    public func convertTo<TNew:SomeTypeProtocol where TNew.T : T>()-> TNew
2) error: cannot invoke initializer for type 'SomeClass<TNew.T>' with an argument list of type '(item: TNew.T)'
        return SomeClass<TNew.T>(item: item as! TNew.T)

3) note: expected an argument list of type '(item: T)'
        return SomeClass<TNew.T>(item: item as! TNew.T)

4)note: protocol requires nested type 'T'
    associatedtype T

2 个答案:

答案 0 :(得分:0)

  

TNew.T : T

这就是问题所在。

冒号:用于声明一致性约束,而不是相等。如果要将两种类型TNew.T == TTNew.T等同,则需要将其重写为T

答案 1 :(得分:0)

我相信你能做的最接近的事情就是:

public func convertTo<TNew where TNew : T>()-> SomeClass<TNew>
{
    return SomeClass<TNew>(item: item  as! TNew)
}

但我不相信你不能强制它只是一个子类而不是同一个类。

小心使用泛型做这种事情。如果您需要不断更改泛型的类型,可能需要考虑使用其他设计。