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.
添加共享对象接口更好的方法
我有很多不同的 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.