Swift:重构单例模式

Swift:重构单例模式,swift,singleton,Swift,Singleton,我有一个Swiftsingleton类,它通过存储几个数组来维护应用程序状态。这里的最佳做法是什么?我们应该改变它吗?如果我们改变了,怎么改变 以下是singleton类: import Foundation class FilterModel { static let sharedInstance = FilterModel() private init() { } var muscleExercisesArray = [Int]() var equipmentExerc

我有一个
Swift
singleton类,它通过存储几个数组来维护应用程序状态。这里的最佳做法是什么?我们应该改变它吗?如果我们改变了,怎么改变

以下是singleton类:

import Foundation


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

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

如果您想了解基本的单例模式,请注意以下几点:

  • 我可能建议您也将该类声明为
    final
    ,以避免将来的开发人员将其子类化,并对
    sharedInstance
    引用的类型造成混淆

  • 我还可以建议,在Swift 3中,惯例是将
    sharedInstance
    的名称简化为
    shared
    。这不是一条硬性规定,而是新兴标准

  • 此实现不是线程安全的。如果你同意的话,我至少会在评论中加入一些警告,提醒未来的开发者注意这个问题。或者,很明显,只需做一点工作,您就可以通过将这一切包装在一些内部同步机制中,将其更改为线程安全的


  • 你说:


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


    是的,由于许多原因(使单元测试更加困难;使职责不明确等),单例不适合用于模型对象,并且有更好的模式(请参阅)。至少,一种简单的方法是让app delegate或根视图控制器实例化此模型对象,然后只将其传递给需要访问它的任何后续控制器(例如,在
    prepareforsgue
    )。通过这种方式,可以明确哪些对象可能与模型交互,从而使职责更加明确。

    添加NSCoding以便可以在应用程序启动之间持久化数据。单例被认为是应用程序体系结构的一种糟糕方法,因此我想知道当我们需要维护应用程序状态时,如何替代它。不知何故,我在网上找不到任何东西,除了DI方法不起作用(或者我不知道如何),在这种情况下,当我们需要用不同的文件修改应用程序状态时。哈,明白了。非常感谢。