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