Swift单例模式的继承?
Swift inheritance of singleton pattern?
有这个class从来没有直接使用过,只是继承了:
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
函数的主体在模式上是相同的。但它有效。
有这个class从来没有直接使用过,只是继承了:
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
函数的主体在模式上是相同的。但它有效。