我试图创建一个泛型类型的typealias,代码如下:
class Cars<T> {
...
}
typealias SportCars = Cars
但我遇到了一个编译错误,如下所示:引用泛型类型“Cars”需要<...>的参数
目前,正如你所发现的那样,使用泛型无法做到这一点。
typealias Foo = Array
// Doesn't work: Reference to generic type 'Array' requires argument in <...>
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
typealias
)的协议的 typealias
,但此时您会遇到一个问题,即 Swift 只允许您将这样的协议用作泛型约束 - 实质上与尝试使用部分类型相同的问题。 - Wes Campaigne可能的解决方法是将类型别名封装到类/结构体中:
struct SportCars<Y> {
typealias T = Cars<Y>
}
/// Usage:
typealias Foo = SportCars<Int>.T
我认为在使用typealias
和泛型时,最远能做到的就是创建一个特定类型的别名,例如:
typealias SportsCar = Cars<Int>
如果您需要为相同的通用类型使用不同的名称,只需对其进行子类化:
class SportCars<T> : Cars<T> {}
这并不完全是一个别名(当期望使用SportCars
时,无法使用Cars
,但反过来则是可能的),但在“受控”的环境中可以使用。虽然我个人不会使用。
Person
?有代码缺失吗? - Antonio