单例模式的Swift继承?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式的Swift继承?相关的知识,希望对你有一定的参考价值。
这个类从未直接使用,只继承:
class ApiBase {}
如何在这里定义通用静态单例default
? - 所以我可以:
class FooApi: ApiBase {} // Want only one instance of `FooApi`
class BarApi: ApiBase {} // Want only one instance of `BarApi`
FooApi.default.foo_api_only_method_name()
BarApi.default.bar_api_only_method_name()
我唯一能想到的就是创造一个protocol
,FooApi
和BarApi
需要实施。但这似乎不是最理想的,宁愿写一个类似的实现:
func `default`<T: ApiBase>() -> T {
if staticInstance == nil {
staticInstance = T()
}
return staticInstance
}
答案
我无法找到使用泛型来解决这个问题的方法,但我的建议是放弃
static let `default` = FooApi()
和
static let `default` = BarApi()
进入两个子类。这样每个人都可以创建自己的单例而不需要太多额外的代码。
另一答案
结束添加界面:
protocol Instance {
associatedtype T
// static var _instance: T {get set} # Can't use; can't override :(
static func instance() -> T
}
可以这样使用:
class ApiBase: Instance {
var root: String = ""
static var _instance: ApiBase = ApiBase()
open class func instance() -> ApiBase {
if _instance.root == "" {
_instance = ApiBase()
}
return _instance
}
}
遗产:
class FooApi: ApiBase {
static var _fooApi: FooApi = FooApi()
override class func instance() -> FooApi {
if _fooApi.root == "" {
_fooApi = FooApi()
}
return _instance
}
}
这是次优的,因为instance
函数的主体在模式上是相同的。但它的确有效。
以上是关于单例模式的Swift继承?的主要内容,如果未能解决你的问题,请参考以下文章