Swift中泛型类的类型

时间:2014-07-13 13:58:51

标签: swift xcode6

我正在尝试制作泛型类的类型,如下所示

class Cars<T> {
  ...
}

typealias SportCars = Cars

但我收到编译错误,如Reference to generic type 'Cars' requires argument in <...>

3 个答案:

答案 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,但可能相反,但在“受控”的环境中它可以工作。我不会用自己的。