我正在尝试制作泛型类的类型,如下所示
class Cars<T> {
...
}
typealias SportCars = Cars
但我收到编译错误,如Reference to generic type 'Cars' requires argument in <...>
答案 0 :(得分:8)
现在,正如你所发现的那样,你不能用泛型做到这一点。
typealias Foo = Array
// Doesn't work: Reference to generic type 'Array' requires argument in <...>
Swift编程语言 iBook章节“类型别名声明”实际上并未说明不能哪些类型别名。但它只是看起来像部分类型(如没有指定占位符的泛型)是不允许的。
如果您认为Swift应该做的事情,请向Apple提交Radar(bugreport)。
在研究这个答案时,我注意到部分类型问题不仅影响typealias
,而且在其他地方也可以看到:
let foo = Array.self
// Doesn't work: Cannot convert the expression's type 'Array<T>.Type' to type 'Array<T>.Type'
// … which is a very confusing error.
var bar: Array.Type
// Doesn't work: Reference to generic type 'Array' requires arguments in <...>
let bar: Array.Type = Array.self
// …/usr/bin/swift: Segmentation fault! :-)
如果您指定占位符类型,则所有这些都有效:
typealias Foo = Array<Int> // Works
let foo = Array<Int>.self // Works
答案 1 :(得分:6)
可能的解决方法是将类型别名包装到class / struct中:
struct SportCars<Y> {
typealias T = Cars<Y>
}
/// Usage:
typealias Foo = SportCars<Int>.T
答案 2 :(得分:2)
我认为你可以使用typealias
和泛型来创建一个特殊类型的别名,例如:
typealias SportsCar = Cars<Int>
如果您需要相同泛型类型的不同名称,则可以将其子类化:
class SportCars<T> : Cars<T> {}
它不完全是别名(当Cars
出现时你不能使用SportCars
,但可能相反,但在“受控”的环境中它可以工作。我不会用自己的。