(对我来说)有点头疼。基本上,我想有两个从同一个类继承的不同单例。在任何一种情况下,我都想使用某个本身派生的类。所以我有Utility,也有AUtil:UtilityBUtil:Utility。并使用Singleton分别在其胃中和ASingleton中用作AUtilityB。我在所有领域都失败了。上一次尝试是一种工厂模式,将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

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

无论如何,我似乎在厄运与死亡之间迷失了方向。

最佳答案

你的意思是这样吗?

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中工作。)

10-06 13:31