一尘不染

创建通用单例

swift

(对我来说)有点危险。基本上,我想有两个从同一个类继承的不同单例。在任何一种情况下,我都想使用某个本身派生的类。所以我Utility既有AUtil:Utility又有BUtil:Utility。和Singleton被用作ASingleton使用AUtility在其胃和B分别。我在所有领域都失败了。上一次尝试是工厂模式,该模式只是将Swift
1.2引入了Segfault:

protocol Initializable { init() }
class A:Initializable {
  var x = "A"
  required init() {}
}
class B:Initializable {
  var x = "B"
  required init() {}
}

class C {
  let t:Initializable
  init(t:Initializable) {
    self.t = t
    println(t)
  }
  func factory() {
    println(t.dynamicType())
  }
}

如前所述,我还尝试使以下模式通用:

private let _SingletonSharedInstance = StaticClass()

class StaticClass {
  class var sharedInstance : StaticClass {
    return _SingletonSharedInstance
  }
}

let s = StaticClass.sharedInstance

(这不是您所看到的通用方法。但是我的所有尝试都失败了,因此我展示了我的出发点。)

无论如何,我似乎迷失在死亡和死亡之间。


阅读 207

收藏
2020-07-07

共1个答案

一尘不染

你的意思是这样吗?

protocol Initializable: class { init() }

private var instances = [String: Initializable]()

func singletonInstance<T: Initializable>(_ ty: T.Type = T.self) -> T {
    let name = NSStringFromClass(ty)
    if let o = (instances[name] as? T) {
        return o
    }
    let o = ty()
    instances[name] = o
    return o
}

例如,它的使用侧。

class Foo: Initializable { required init() {} }
class Bar: Initializable { required init() {} }

let foo1 = singletonInstance() as Foo // or `singletonInstance(Foo.self)`
let foo2 = singletonInstance() as Foo
assert(foo1 === foo2)

let bar1 = singletonInstance() as Bar
let bar2 = singletonInstance() as Bar
assert(bar1 === bar2)

(我已经测试了上面的代码,并使其可以在Swift 1.2中工作。)

2020-07-07