单例模式的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()

我唯一能想到的就是创造一个protocolFooApiBarApi需要实施。但这似乎不是最理想的,宁愿写一个类似的实现:

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继承?的主要内容,如果未能解决你的问题,请参考以下文章

Unity单例模式(普通单例和继承MonoBehaviour的单例)

Unity单例模式最佳实践(附代码)

swift语言实现单例模式

设计模式(Swift) - 单例模式备忘录模式和策略模式

swift Swift中单例模式的示例

swift实现单例的四种方式