我有很多不同的类需要访问相同的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
}
}
并收到错误消息“来自扩展的声明无法覆盖”。从“尚未”我猜他们正在努力。与此同时,还有另一种方法可以达到同样的效果吗?
答案 0 :(得分:1)
我假设你只需要一个共享的GKMatch,而不是GKMatchDelegate的每个子类的GKMatch。在前一种情况下,我认为你是在思考这个问题。只有一个公共var,它不是任何类中的单例。
public var sharedGKMatch: GKMatch = GKMatch()
如果你想让它只读
public let sharedGKMatch - GKMatch()
这是一个类,所以GKMatch的内容仍然是可变的。
答案 1 :(得分:1)
大多数应用程序都有某种数据模型 - 一个对象或一组对象,它存储应用程序在应用程序执行任何操作时需要执行的所有信息。例如,对于文字处理器,数据模型可以是打开文档的集合以及任何全局配置信息(打印机信息,字体,首选项等)。对于游戏,该模型包含游戏的当前状态 - 董事会状态,当前位置和坏人的速度,收集的金币数量等等。
您的应用也应该有一个数据模型,听起来当前GKMatch
实例应该包含在该模型中。这样,任何有权访问模型的类都可以自动访问GKMatch
,这意味着您只需要传递一件事。这几乎肯定比向其他人的课程添加共享对象接口更好。