我有一个名为Foo
的协议和一个名为Bar
的结构。 Bar
符合Foo
。
protocol Foo {}
struct Bar: Foo {}
将Bar
实例附加到Bar
数组,按预期工作。
var array = [Bar]()
array.append(Bar())
现在,我有一个名为Baz
的通用结构,它使用符合Foo
的类型进行初始化(例如Bar
)。
struct Baz<T: Foo> {
private(set) var array = [T]()
init() {
if T.self is Bar.Type {
// Error: Cannot invoke 'append' with an argument list of type (Bar)
array.append(Bar())
}
}
}
尝试追加到数组会导致以下错误:
无法调用&#39;追加&#39;使用类型(Bar)的参数列表
为什么这不能按预期工作?
顺便说一下,用例是这样的:
let bazBarStack = Baz<Bar>().array
let bazQuxStack = Baz<Qux>().array
答案 0 :(得分:1)
您需要在数组中存储类型为T的对象。因此,您应该使用as! T
进行强制转换:
struct Baz<T: Foo> {
private(set) var array = [T]()
init() {
if T.self is Bar.Type {
array.append(Bar() as! T)
}
}
}
答案 1 :(得分:0)
由于 app.use(express.static('./public'));
包含单个类型array
的元素,因此必须符合T
但不一定与Foo
兼容。看起来你希望有一个数组可以容纳任何符合Bar
的内容;在这种情况下,完全摆脱泛型并简单地写
Foo
然后你的init将是
private(set) var array = [Foo]()