我正在尝试让以下代码在游乐场中工作:
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
答案 0 :(得分:0)
TNew.T : T
这就是问题所在。
冒号:
用于声明一致性约束,而不是相等。如果要将两种类型TNew.T == T
和TNew.T
等同,则需要将其重写为T
。
答案 1 :(得分:0)
我相信你能做的最接近的事情就是:
public func convertTo<TNew where TNew : T>()-> SomeClass<TNew>
{
return SomeClass<TNew>(item: item as! TNew)
}
但我不相信你不能强制它只是一个子类而不是同一个类。
小心使用泛型做这种事情。如果您需要不断更改泛型的类型,可能需要考虑使用其他设计。