具有关联类型

时间:2016-07-04 00:38:53

标签: swift protocols

我有第一个协议

protocol Prot1
{

}

第二个:

protocol Prot2
{
    associatedtype P: Prot1

    func doSomething(param: P)
}

如何制作Prot2类型的数组?

我试过了:

var myArray = [Prot2]()

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

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

修改

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

AnyProt2<Prot1Type: Prot1>: Prot2

让我有一个带

的数组
[AnyProt2<Prot1Class>] 

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

[AnyProt2] or [AnyProt2<Prot1>]

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

  

使用&#39; Prot1&#39;作为符合协议的具体类型&#39; Prot1&#39;不受支持。

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

1 个答案:

答案 0 :(得分:5)

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

protocol Prot1 {
}

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

class MyClass<T: Prot2> {
    var arr: [T] = []
}

但是这个解决方案几乎推迟了指定实现Prot2的具体类型并让MyClass的消费者处理它。

听起来你的情况需要使用名为&#34; type erasure&#34;的东西。不幸的是,我不能在这里解释它,但这里有一些非常好的文章,甚至是让我理解这个概念的会谈: