gpt4 book ai didi

swift - 在 Swift wrt 消息类型中注册接收者对象

转载 作者:行者123 更新时间:2023-11-30 10:19:09 25 4
gpt4 key购买 nike

我正在尝试在 Swift 中实现一种发布-订阅。在我当前的情况下,有些消息仅发送给接收者,而其他消息还需要触发回调。现在,我定义了一个 enum 来保存不同的消息,例如

enum Message
{
case Foo
case Bar(() -> Void)
}

也就是说,Foo 是一条没有回调的消息,而 Bar 需要回调。接收者可以对接收到的消息应用开关并做出决定。此外,接收者只能订阅消息类型的子集。

对于注册,有一个代理保存消息类型和关联接收者的字典。 IMO 实现这一点的理想解决方案是:

class Broker
{
var subscribers = Dictionary<Message, Array<Receiver>>()
}

其中Receiver是一个协议(protocol),Message是上面定义的enum。显然这行不通,因为

  1. 消息不可散列,并且
  2. 注册需要一个类型作为参数,这是不可能的,因为这不是泛型。

我当前的解决方案是扩展enum:

func hash() -> String
{
switch (self)
{
case Foo : return "Foo"
case Bar(_) : return "Bar"
}
}

并将代理中的字典替换为:

var subscribers = Dictionary<String, Array<Receiver>>()

这可行,但现在注册需要消息实例才能获取哈希值,例如

broker.subscribe(receiver: self, message: Message.Bar({}).hash())

这感觉很尴尬——至少对我来说是这样。我认为虽然这没有错,但它似乎不是最好的解决方案。

所以,问题是:订阅具有不同可接收消息类型的多个接收者的最佳方法是什么,并且可能不会丢失枚举

最佳答案

尝试如下:

enum Message
{
case Foo
case Bar(() -> Void)

static let FooType = "Foo"
static let BarType = "Bar"

func hash() -> String {
switch self {
case Foo: return Message.FooType
case Bar(_): return Message.BarType
}
}
}

broker.subscribe(receiver: self, message: Message.BarType)

关于swift - 在 Swift wrt 消息类型中注册接收者对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28282338/

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