Swift2:用扩展把苹果class变成单例?

Swift 2: use extensions to turn an Apple class into a singleton?

我有很多不同的 classes 需要访问同一个 GKMatch 对象,而且我越来越担心我必须多久传递一次 GKMatch 引用。我想找到一种方法,任何 class 都可以可靠地获得相同的 GKMatch 实例。

我建议通过 GKMatchDelegate 间接执行此操作,如下所示:

extension GKMatchDelegate {
    static func sharedGKMatch ()->GKMatch? { return nil }
}

然后,在我的 GKMatchDelegate 子 class 中,我将创建一个 currentMatch: GKMatch? 变量并将函数重写为 return 它。

当我试图在操场上测试这个概念时,我这样做了:

class SingletonTest {}

extension SingletonTest {
  static func shared ()->SingletonTest? { return nil }
}

class SubclassOfSingletonTest: SingletonTest {
  static var sharedTest: SingletonTest?
  override static func shared()->SingletonTest? {
    return sharedTest
  }
}

并收到错误消息 "Declarations from extensions cannot be overriden yet"。从 "yet" 我猜他们正在努力。同时,还有其他方法可以达到同样的效果吗?

我假设您只需要一个共享 GKMatch,而不是 GKMatchDelegate 的每个子 class 一个 GKMatch。在前一种情况下,我认为你想得太多了。只是有一个 public var 是在任何 class.

中都不存在的单例
public var sharedGKMatch: GKMatch = GKMatch()

如果你想让它只读

public let sharedGKMatch - GKMatch()

它是一个 class,所以 GKMatch 的内容仍然是可变的。

大多数应用程序都有某种数据模型——一个对象或一组对象,用于存储应用程序执行任何操作所需的所有信息。例如,对于文字处理器,数据模型可能是打开的文档以及任何全局配置信息(打印机信息、字体、首选项等)的集合。对于游戏,模型包含游戏的当前状态——棋盘状态、坏人的当前位置和速度、收集的金币数量等等。

您的应用也应该有一个数据模型,听起来当前的 GKMatch 实例应该包含在该模型中。这样,任何可以访问模型的 class 都可以自动访问 GKMatch,这意味着您只需要传递一件事。这几乎肯定是比向其他人的 class.

添加共享对象接口更好的方法