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

5
我有第一个协议。
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>]

我尝试了第二种方法,但它给了我以下错误信息: “Using 'Prot1' as a concrete type conforming to protocol 'Prot1' is not supported.”。
在我的上下文中,Prot1代表一个区间(Interval),而Prot2代表一个事件(Event),所以我希望拥有一个数组,其中包含不同类型的事件,这些事件可能具有不同类型的区间。 我还想问一下是否可以使Prot1扩展Equatable,并在AnyProt2中确认该协议。

有关更新方面需要帮助吗? - 4bottiglie
1个回答

8

根据您的使用情况,您可能可以使用通用类型来实现,如下所示:

protocol Prot1 {
}

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

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

但是这种解决方案基本上推迟了具体实现Prot2的类型的指定,并使消费者处理它。
听起来你的情况需要使用一些被称为“类型擦除”的东西。不幸的是,我无法在这里对此进行解释,但这里有一些非常好的文章甚至演讲帮助我理解这个概念:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接