创建通用单例

qwe*_*_so 6 generics singleton factory swift

这对我来说有点头脑(对我来说).基本上我想要从同一个类继承2个不同的单身.在任何一个我想要使用某个本身派生的类.所以我有Utility和两个AUtil:UtilityBUtil: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())
  }
}
Run Code Online (Sandbox Code Playgroud)

如上所述,我也尝试将以下模式设为通用:

private let _SingletonSharedInstance = StaticClass()

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

let s = StaticClass.sharedInstance
Run Code Online (Sandbox Code Playgroud)

(如你所见,这个并不通用.但我的所有尝试都失败了,所以我展示了我的起点.)

无论如何,我似乎在厄运和死亡之间迷失了.

fin*_*all 6

你的意思是这样的吗?

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
}
Run Code Online (Sandbox Code Playgroud)

例如,它的使用方面.

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)
Run Code Online (Sandbox Code Playgroud)

(我已经测试了上面的代码并让它在Swift 1.2中运行.)