Swift 2:使用扩展将Apple类变成单例?

时间:2015-10-26 20:48:43

标签: singleton swift2

我有很多不同的类需要访问相同的GKMatch对象,而且我对我经常传递GKMatch参考的频率持谨慎态度。我想找到一种方法,任何类都可以可靠地获得相同的GKMatch实例。

我建议通过GKMatchDelegate间接进行,如下所示:

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

然后,在我的GKMatchDelegate子类中,我将创建一个currentMatch: GKMatch?变量并覆盖该函数以返回它。

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

class SingletonTest {}

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

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

并收到错误消息“来自扩展的声明无法覆盖”。从“尚未”我猜他们正在努力。与此同时,还有另一种方法可以达到同样的效果吗?

2 个答案:

答案 0 :(得分:1)

我假设你只需要一个共享的GKMatch,而不是GKMatchDelegate的每个子类的GKMatch。在前一种情况下,我认为你是在思考这个问题。只有一个公共var,它不是任何类中的单例。

public var sharedGKMatch: GKMatch = GKMatch()

如果你想让它只读

public let sharedGKMatch - GKMatch()

这是一个类,所以GKMatch的内容仍然是可变的。

答案 1 :(得分:1)

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

您的应用也应该有一个数据模型,听起来当前GKMatch实例应该包含在该模型中。这样,任何有权访问模型的类都可以自动访问GKMatch,这意味着您只需要传递一件事。这几乎肯定比向其他人的课程添加共享对象接口更好。

相关问题