在Swift中结合泛型和扩展?
看看: 我看到了一个非常通用的模式,用于创建类的共享单例实例。我希望能够为“所有类”创建一个扩展,该扩展使用泛型实现这个sharedInstance方法在Swift中结合泛型和扩展?,swift,Swift,看看: 我看到了一个非常通用的模式,用于创建类的共享单例实例。我希望能够为“所有类”创建一个扩展,该扩展使用泛型实现这个sharedInstance方法 我看不出有任何语法可以这样做;有人想试一试吗?我认为这是不可能的 即使可以扩展Any/AnyObject,每个对象都将共享sharedInstance单例getter的相同实现,因此也是相同的静态实例变量。因此,instance将被设置为调用sharedInstance的第一个类的实例 extension Any { class va
我看不出有任何语法可以这样做;有人想试一试吗?我认为这是不可能的 即使可以扩展
Any
/AnyObject
,每个对象都将共享sharedInstance
单例getter的相同实现,因此也是相同的静态实例
变量。因此,instance
将被设置为调用sharedInstance
的第一个类的实例
extension Any {
class var sharedInstance:TPScopeManager {
get {
struct Static {
static var instance : TPScopeManager? = nil
}
if !Static.instance {
Static.instance = TPScopeManager()
}
return Static.instance!
}
}
}
...
NSString.sharedInstance() // Returns an NSString
NSArray.sharedInstance() // Returns the same NSString object!
正如其他人所指出的,Swift提供了一种更简单的方法来创建单身 举个例子:假设我们有一个名为
Model
的类,我们希望有一个在整个应用程序中可见的实例。我们需要在全局范围内编写的内容是:
这将创建一个模型
类的实例,在任何地方都可见,并且不能被另一个实例替换(嗯,这正是人们对单例的期望,不是吗?)
另一方面,这种方法仍然允许您创建除单例之外的其他Model
实例。虽然这与其他语言中对单例的官方定义不同,但这种方法有一个有趣的优点,即允许为测试目的创建其他实例(单例在单元测试世界中有坏消息:)
Swift很快将提供创建真正的
单例类所需的一切(现在很难,因为还不允许使用类变量)。尽管如此,上述方法对于许多Swift程序员来说可能已经足够了。在Swift中,您可以对NSObject进行扩展,但不能扩展任何/AnyObject
let modelSingleton = Model()