我有第一个协议
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中确认协议。
答案 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;的东西。不幸的是,我不能在这里解释它,但这里有一些非常好的文章,甚至是让我理解这个概念的会谈: