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()

我唯一能想到的就是创建一个 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 函数的主体在模式上是相同的。但它有效。