Swift中泛型类的类型

Enc*_*PTL 15 swift xcode6

我正在尝试按如下方式创建泛型类的类型

class Cars<T> {
  ...
}

typealias SportCars = Cars
Run Code Online (Sandbox Code Playgroud)

但我得到一个编译错误如下 Reference to generic type 'Cars' requires argument in <...>

Dar*_*ust 8

现在,正如你所发现的那样,你不能用泛型做到这一点.

typealias Foo = Array
// Doesn't work: Reference to generic type 'Array' requires argument in <...>
Run Code Online (Sandbox Code Playgroud)

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! :-)
Run Code Online (Sandbox Code Playgroud)

如果指定占位符类型,则所有这些都有效:

typealias Foo = Array<Int> // Works
let foo = Array<Int>.self // Works
Run Code Online (Sandbox Code Playgroud)


kja*_*jam 6

可能的解决方法是将类型别名包装到class/struct中:

struct SportCars<Y> {
  typealias T = Cars<Y>
}

/// Usage:
typealias Foo = SportCars<Int>.T
Run Code Online (Sandbox Code Playgroud)


Ant*_*nio 2

我认为您可以使用typealias泛型的最远方法是创建专用类型的别名,例如:

typealias SportsCar = Cars<Int>
Run Code Online (Sandbox Code Playgroud)

如果您需要为同一泛型类型使用不同的名称,您可以将其子类化:

class SportCars<T> : Cars<T> {}
Run Code Online (Sandbox Code Playgroud)

它不完全是一个别名(您不能在预期的Cars时候使用SportCars,但相反的情况是可能的),但在“受控”环境中它可以工作。不过我不会用自己。