单例模式的Swift继承?

时间:2018-02-25 12:11:39

标签: swift inheritance singleton swift4 swift-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
}

2 个答案:

答案 0 :(得分:1)

我无法找到使用泛型来解决这个问题的方法,但我的建议是放

static let `default` = FooApi()

static let `default` = BarApi()

进入两个子类。这样每个人都可以创建自己的单例,而无需太多额外的代码。

答案 1 :(得分:0)

结束添加界面:

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函数的主体在模式上是相同的。但它确实有效。