附加到Swift

时间:2016-03-08 04:19:28

标签: arrays swift generics

我有一个名为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

2 个答案:

答案 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]()