【问题标题】:Swift: Generics with callbacksSwift:带有回调的泛型
【发布时间】:2016-04-25 19:38:59
【问题描述】:

我试图保留一个回调字典,其中回调可以包含一个基类类型的参数,然后我可以使用任何派生类型调用回调。当我尝试这样做时,我得到一个编译错误。我来自 C++/C# 背景,所以我很难理解这是如何在 Swift 中完成的。

这是一个简化的用例:

public func RegisterMessage<T: Message>(type: MessageType, callback: (msg: T) -> ())
{
    // ERROR: Cannot assign a value of type '(msg: T) -> ()' to a value
    //        of type '((msg: Message) -> ())?'
    MessageCallbacks[type] = callback
}

private var MessageCallbacks : [MessageType : (msg: Message) -> ()] = [:]

如果它正在编译,这是我期望使用它的代码:

RegisterMessage<SetPositionMessage>(MessageType.SetPosition, OnSetPosition)

// This would take msg's type, using it to find the callback in the
// dictionary, and then it would pass the msg into the callback function.
let msg = SetPositionMessage()
SendMessage(msg)

public func SendMessage(msg: Message)
{
    MessageCallbacks[msg.MessageType]?.(msg)
}

我想要完成的是,我有一种方法可以指定一个回调函数,该回调函数应该根据正在发送的消息类型调用。

这是显示我的问题的另一个代码示例。我可以有一个接受派生类型的基类型容器,但这不适用于具有基类型的回调容器。

public class BaseClass {
}

public class DerivedClass : BaseClass {
}

var Container: [BaseClass] = []
Container.append(BaseClass())
Container.append(DerivedClass())

var Callbacks: [(msg: BaseClass) -> ()] = []

func BaseCallback(msg: BaseClass) {}

func DerivedCallback(msg: DerivedClass) {}

Callbacks.append(BaseCallback)
Callbacks.append(DerivedCallback)
// ERROR! Cannot assign a value of type '(DerivedClass) -> ()' to expected argument type '(msg: BaseClass) -> ()'

【问题讨论】:

  • 你可以使用:MessageCallbacks[type] = (callback as! (msg: Message) -&gt; ())
  • 成功了,谢谢!
  • 太棒了。我会将其添加为答案,以便您将其关闭...

标签: swift generics callback


【解决方案1】:

您可以使用以下方式向下转换:

MessageCallbacks[type] = (callback as! (msg: Message) -> ())

【讨论】:

  • 如果我不想向下转换怎么办,因为我想保留派生类型以检查响应是否可以转换为派生类型。这可能吗?..
  • 如果你说你的回调有不同的返回类型,他们都必须从一个共同的基础派生。当您进行回调时,您不会丢失响应的派生类型,但您必须尝试将其转换回预期的类型。
  • 这似乎不适用于使用 Swift3 的我。我得到以下信息:无法将类型 '(swiftest.SetPositionMessage) -> ()' (0x10074b0d0) 的值转换为 '(swiftest.Message) -> ()'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多