qwe*_*_so 6 generics singleton factory swift
这对我来说有点头脑(对我来说).基本上我想要从同一个类继承2个不同的单身.在任何一个我想要使用某个本身派生的类.所以我有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())
}
}
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)
(如你所见,这个并不通用.但我的所有尝试都失败了,所以我展示了我的起点.)
无论如何,我似乎在厄运和死亡之间迷失了.
你的意思是这样的吗?
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中运行.)
| 归档时间: |
|
| 查看次数: |
3168 次 |
| 最近记录: |