Swift:重构单例模式

时间:2017-01-23 06:14:50

标签: swift singleton

我有一个Swift单例类,通过存储多个数组来维护应用程序状态。什么是最佳做法'怎么去这里?我们应该改变它,如果我们改变它,那么如何?

这是单身人士课程:

import Foundation


class FilterModel {
  static let sharedInstance = FilterModel()
  private init() { }

  var muscleExercisesArray = [Int]()
  var equipmentExercisesArray = [Int]()
  var typeExercisesArray = [Int]()
}

1 个答案:

答案 0 :(得分:2)

如果您对基本单例模式有疑问,可以参考几点:

  1. 我可能会建议您将类声明为final,以避免将某个未来的开发人员子类化,并引入关于sharedInstance所指的类型的混淆。

  2. 我可能还建议在Swift 3中,惯例是将sharedInstance的名称简化为shared。它不是一个严格的规则,但却是新兴的标准。

  3. 此实现不是线程安全的。如果您对此表示满意,我至少会在评论中包含一些警告,警告未来的开发人员。或者,显然,通过一些工作,你可以通过将这一切包装在一些内部同步机制中来改变它是线程安全的。

  4. 你说:

      

    单身人士被认为是应用程序架构的糟糕方法,所以当我们需要维护应用程序状态时,我想知道该怎么做而不是它。不知何故我在网上找不到任何东西,除了DI方法不起作用(或者我不知道怎么样)在这种情况下我们需要用不同的文件修改app状态

    是的,出于多种原因,单身人士不适合模型对象(使单元测试变得更难;责任不明确等),并且有更好的模式(参见What's Alternative to Singleton)。至少,一个简单的方法是让app委托或根视图控制器实例化该模型对象,然后只将其传递给后续控制器需要访问它的任何内容(例如在prepareForSegue中)。通过这种方式,可以明确指出哪些对象可能与模型进行交互,从而使责任更加清晰。