gpt4 book ai didi

ios - 持有引用 : the most appropriate for this scenario in Swift? 的完成处理程序 VS

转载 作者:行者123 更新时间:2023-11-28 06:26:29 25 4
gpt4 key购买 nike

我有以下场景:一个对象 A创建一个对象 B应该根据用户的选择执行一些操作。 AB的代表. A不持有对用户所做选择的引用(由另一个对象 C 表示),但它在创建 B 的方法中知道它,它需要知道当对象 B 时选择的是哪个。完成其任务并通过调用相应的协议(protocol)方法来通知 A实现。

对于这种情况我想到的第一个解决方案是在A中有一个引用供选择C ,并在 B 的协议(protocol)方法实现中访问它完成时调用。但也许处理这样的选择会更好、更“swift ”C通过传递完成处理程序,从而避免在 A 中持有引用直到 B完成。

您如何看待第二种解决方案(将闭包作为完成处理程序传递给 B)?它会比第一个解决方案(在 A 中持有引用)更合适吗?

在这种情况下,我应该如何实现该解决方案?应该B有闭包的引用作为完成处理程序调用吗?

编辑:我的场景的一些附加信息:

  • A不完全具有属性 B ,它将其推送到导航 Controller 中。
  • A并不总是需要知道 C什么时候B完成,这取决于向 B 请求的任务
  • A只需要知道 C一次B (取决于 B 执行的任务,如前所述)已完成更新一些数据。
  • A只需要知道(取决于 B 执行的任务,如前所述)只有一个 C马上

最佳答案

简而言之,在您的所有权层次结构中,A 拥有 B,两个类都使用 C,您想知道 C 应该属于 AB

您有 3 个基本选项:

  1. AB 都拥有C

这意味着 AC 保存到一个属性中,在初始化期间将其传递给 B 并且 B 也将 C 保存到属性中。

  1. A 拥有 C

这意味着 AC 保存到属性中并且根本不将其传递给 BB 在需要时使用委托(delegate)方法请求它(A 作为 B 的数据源)。

  1. B 拥有 C

这意味着 AC 直接传递给 BB 将其保存到具有公共(public) getter 的属性当 A 需要 C 时,它会从 B 中读取它。

(请注意,您的想法是第三个选项的变体)。

请注意,这三个选项都与敏捷性无关,这纯粹是一种架构选择,没有“最佳”解决方案。如果要决定,则必须考虑应用程序的状态,例如:

  1. 即使在 B 被销毁之后,C 是否应该存在于 A 中?如果是,请不要使用第三个选项。

  2. A 是否同时处理多个 BC?那就不要使用第二个选项。

  3. C 是可变的还是不可变的?它是值类型还是类类型?如果是值类型,则不能使用第一个选项。

在大多数情况下,上述所有 3 个选项都可以,并且选择将是个人决定,如果您在整个应用程序中保持一致,不会影响代码的质量。

编辑:

在我看来,第三个选项确实是最适合您情况的解决方案。然而,正如我之前所说,没有一种“最佳”解决方案

关于ios - 持有引用 : the most appropriate for this scenario in Swift? 的完成处理程序 VS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41728557/

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