【问题标题】:Swift array of protocols with associatedtype [duplicate]具有关联类型的 Swift 协议数组 [重复]
【发布时间】:2016-07-04 00:38:53
【问题描述】:

我有第一个协议

protocol Prot1
{

}

第二个:

protocol Prot2
{
    associatedtype P: Prot1

    func doSomething(param: P)
}

如何创建 Prot2 类型的数组?

我试过了:

var myArray = [Prot2]()

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

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

编辑:

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

AnyProt2<Prot1Type: Prot1>: Prot2

让我有一个数组

[AnyProt2<Prot1Class>] 

但我要求一个可以包含各种 AnyProt2 的数组,例如:

[AnyProt2] or [AnyProt2<Prot1>]

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

不支持将“Prot1”用作符合协议“Prot1”的具体类型。

在我的上下文中,Prot1 是间隔,Prot2 是一个事件,所以我想拥有和排列不同类型的事件,这些事件可能有不同类型的间隔。 我也想问一下是否可以让Prot1扩展Equatable并在AnyProt2中确认协议。

【问题讨论】:

  • 对更新有帮助吗?

标签: swift protocols


【解决方案1】:

根据您的用例,您可能会避免使用泛型,如下所示:

protocol Prot1 {
}

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

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

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

听起来您的情况需要使用称为“类型擦除”的东西。不幸的是,我无法在这里解释它,但这里有一些非常棒的文章甚至是帮助我理解这个概念的演讲:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2020-05-24
    相关资源
    最近更新 更多