gpt4 book ai didi

swift - 协议(protocol)实例的集合

转载 作者:行者123 更新时间:2023-11-28 07:10:59 24 4
gpt4 key购买 nike

尝试 solve a problem这暂时无关紧要,我尝试在 Swift 中做一些在 C# 代码中很常见的事情:定义几个协议(protocol)来描述生产者-消费者关系,然后提供生产者的具体实现:

protocol Consumer
{
func someInterestingThing( producer: Producer )

func anotherInterestingThing( producer: Producer, happenedBefore: Bool )
}

protocol Producer
{
func addConsumer( consumer: Consumer )

func removeConsumer( consumer: Consumer )
}


class ConcreteProducer : Producer
{
private var _consumers = Set<Consumer>()

func addConsumer( consumer: Consumer ) {
_consumers.insert(consumer);
}

func removeConsumer( consumer: Consumer ) {
_consumers.remove(consumer);
}
}

这不起作用,因为我的Consumer 协议(protocol)不是Hashable,它必须是进入 Swift Set。 (在 C# 中,这不会出现,因为所有 对象都继承了 hashable-nature。)

好的,所以我将我的协议(protocol)定义为继承自 Hashable;不完全优雅,但应该工作。没有!现在我使用它的所有地方,我得到:

error: protocol 'Consumer' can only be used as a generic constraint
because it has Self or associated type requirements

显然,这是因为 Hashable 继承了 Equatable,它在自身上定义了 ==。从字面上看是 Self,其中放置了一些 extra restrictions关于如何使用该类型。

也许有一些我还没有理解的泛型魔法,它允许我声明集合和方法,以及编译器会满意的类型?

我可能会尝试做一些有味道的事情,比如用更抽象的术语定义存储,并在添加和删除方法上强制执行协议(protocol)一致性。但是 AnyObject 没有实现 Hashable。 (有更好的选择吗?)

我可以尝试将消费者封装在一个实现了 Hashable 的私有(private)包装器中,但我需要能够比较这些包装器,这取决于消费者的身份,然后看来我又回到了同一条船上。

我只想将这些东西收集起来,而不是绝对必要的。我该怎么做?

最佳答案

这个怎么样?

protocol Consumer: class {
func someInterestingThing( producer: Producer )
func anotherInterestingThing( producer: Producer, happenedBefore: Bool )
}

protocol Producer {
func addConsumer( consumer: Consumer )
func removeConsumer( consumer: Consumer )
}

class ConcreteProducer : Producer {
private var _consumers = [ObjectIdentifier:Consumer]()

func addConsumer( consumer: Consumer ) {
_consumers[ObjectIdentifier(consumer)] = consumer
}

func removeConsumer( consumer: Consumer ) {
_consumers[ObjectIdentifier(consumer)] = nil
}
}
  • 声明Consumer作为class唯一协议(protocol)
  • 使用Dictionary<ObjectIdentifier, Consumer>而不是 Set<Consumer>

关于swift - 协议(protocol)实例的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28506330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com