具有关联类型的Swift协议数组

4bo*_*lie 4 protocols swift

我有第一个协议

protocol Prot1
{

}
Run Code Online (Sandbox Code Playgroud)

第二个:

protocol Prot2
{
    associatedtype P: Prot1

    func doSomething(param: P)
}
Run Code Online (Sandbox Code Playgroud)

如何制作Prot2类型的数组?

我试过了:

var myArray = [Prot2]()
Run Code Online (Sandbox Code Playgroud)

但它给了我这个错误:协议Prot2只能用作通用约束,因为它具有Self或相关类型要求

有没有其他方法来制作模板协议?

编辑:

对不起,如果我迟到了,但我正在测试解决方案.据我所知,类型擦除

AnyProt2<Prot1Type: Prot1>: Prot2
Run Code Online (Sandbox Code Playgroud)

让我有一个数组

[AnyProt2<Prot1Class>] 
Run Code Online (Sandbox Code Playgroud)

但我要的是一个可以包含各种AnyProt2的数组:

[AnyProt2] or [AnyProt2<Prot1>]
Run Code Online (Sandbox Code Playgroud)

我尝试了第二次,但它给了我:

不支持使用'Prot1'作为符合协议'Prot1'的具体类型.

在我的上下文中,Prot1是Interval,而Prot2是一个事件,所以我想拥有和使用不同类型的可能具有不同种类间隔的事件的数组.我还想询问是否可以使Prot1扩展Equatable并在AnyProt2中确认协议.

Sas*_*ats 5

根据您的使用情况,您可能会使用泛型,如下所示:

protocol Prot1 {
}

protocol Prot2 {
    associatedtype P: Prot1
    func doSomething(param: P)
}

class MyClass<T: Prot2> {
    var arr: [T] = []
}
Run Code Online (Sandbox Code Playgroud)

但是这个解决方案几乎推迟了实现的具体类型的指定,Prot2并使消费者MyClass能够处理这个问题.

听起来你的情况需要使用一种叫做"类型擦除"的东西.不幸的是,我无法在这里解释,但这里有一些非常好的文章,甚至是有助于我理解这个概念的演讲: