【问题标题】:How to wrap protocol with optional methods?如何用可选方法包装协议?
【发布时间】:2015-04-04 19:34:42
【问题描述】:

任务很简单:我需要创建将所有内容委托给被包装对象的包装器。只有包装对象的类型是包含可选方法的协议。我的包装器是实现相同的协议。

如何处理可选方法?我可以:

  1. 我可以在我的包装器中实现它们。但是,如果它们不是由被包装的对象实现的,我应该从这个实现中返回什么?
  2. 不实施它们。在这种情况下,包装对象将不会提供包装对象的一些我不想要的功能。

还有更好的选择吗?请注意,我正在使用 Swift。

【问题讨论】:

  • 我很确定你不能在 Swift 中做到这一点,你需要 Obj-C,尤其是访问 NSInvocation。或者只是忽略可选方法,因为无论如何都有 Obj-C 功能。它们不存在于纯 Swift 中。
  • 我知道this answer 是Objective-C,但为了清楚起见,您是否尝试在Swift 中完成类似的事情?

标签: swift wrapper swift-protocols


【解决方案1】:

如果您使用可选方法,您将使用 Objective-C 运行时。这意味着您可以查询对象是否响应可选方法,更好地解释here

如果您是 Objective-C 运行时的新手,您可以在Objective-C Runtime Programming Guide 阅读有关它的更多信息。

我认为包装器应该在运行时检查实现,如果缺少则应该在调用这些可选方法之一时返回某种指示符,可能是布尔值。

【讨论】:

  • 当然,我可以检测到被包装的对象是否在运行时实现了可选方法。到那时,无论包装器中的方法是否已实现......这让我们得到您关于在运行时检查实现并返回 bool 或其他东西的建议。包装器仅作为协议对客户端可见(与用作包装对象类型的协议相同)。我不能修改这个协议(Cocoa 的一部分),所以我不能向包装器的接口添加任何东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 2014-07-24
  • 2017-06-03
  • 2014-08-04
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
相关资源
最近更新 更多