如何在Swift中创建与泛型共存的单个类

如何在Swift中创建与泛型共存的单个类,swift,generics,singleton,Swift,Generics,Singleton,我有一门课是这样的: class Single { static let sharedInstance: Single = Single() ... } class Single<T: Hashable> { static let sharedInstance: Single = Single() var dic: [T: Any] = [:] // Here use the Generic } 但我想在这个类中使用泛型,如下所示: class S

我有一门课是这样的:

class Single {
    static let sharedInstance: Single = Single()
    ...
}
class Single<T: Hashable> {
    static let sharedInstance: Single = Single()
    var dic: [T: Any] = [:] // Here use the Generic
}
但我想在这个类中使用泛型,如下所示:

class Single {
    static let sharedInstance: Single = Single()
    ...
}
class Single<T: Hashable> {
    static let sharedInstance: Single = Single()
    var dic: [T: Any] = [:] // Here use the Generic
}
单类{
静态let sharedInstance:Single=Single()
var dic:[T:Any]=[:]//这里使用泛型
}
我从Xcode得到这个结果

泛型类型中不支持静态存储属性

我已经在stackoverflow中搜索了这个错误,但是所有的答案都不适合我。像这个


我该如何解决这个问题呢?

我想你只是想让一个单例能够在你的字典中存储任何可哈希键?如果是,请执行以下操作:

class Single {
    static let sharedInstance: Single = Single()
    var dic: [AnyHashable : Any] = [:]
}

Single.sharedInstance.dic["Grimxn"] = 1
Single.sharedInstance.dic[1] = "Grimxn"

Single.sharedInstance.dic // [1: "Grimxn", "Grimxn": 1] as required

我想你只是想让一个单身汉能够在你的字典中存储任何哈希键?如果是,请执行以下操作:

class Single {
    static let sharedInstance: Single = Single()
    var dic: [AnyHashable : Any] = [:]
}

Single.sharedInstance.dic["Grimxn"] = 1
Single.sharedInstance.dic[1] = "Grimxn"

Single.sharedInstance.dic // [1: "Grimxn", "Grimxn": 1] as required

可以使用静态计算属性声明泛型类型,如下所示:

class Single<T: Hashable> {
  static var sharedInstance: Single? {
    if self.sharedInstance != nil {
        return self.sharedInstance
    } else {
        return Single()
    }
  }
  var dic: [T: Any] = [:]
}
单类{
静态var sharedInstance:单个{
如果self.sharedInstance!=零{
返回自我共享状态
}否则{
返回单()
}
}
变量dic:[T:Any]=[:]
}

您可以使用静态计算属性声明泛型类型,如下所示:

class Single<T: Hashable> {
  static var sharedInstance: Single? {
    if self.sharedInstance != nil {
        return self.sharedInstance
    } else {
        return Single()
    }
  }
  var dic: [T: Any] = [:]
}
单类{
静态var sharedInstance:单个{
如果self.sharedInstance!=零{
返回自我共享状态
}否则{
返回单()
}
}
变量dic:[T:Any]=[:]
}

可能会将
共享状态
设置为静态计算属性?是的,你是对的!但是为什么静态计算属性可以解决这个问题呢?它也是一个静态的单一实例。我不知道如何使用它。您是否打算有几个单例,每个哈希类型一个?如果是这样,您将如何实例化它们?
static
没有“做”这些,因为它没有引用
t
?或者你只是想让一个单例能够在你的字典中存储任何可散列键吗?也许让
sharedInstance
成为一个静态计算属性?是的,你是对的!但是为什么静态计算属性可以解决这个问题呢?它也是一个静态的单一实例。我不知道如何使用它。您是否打算有几个单例,每个哈希类型一个?如果是这样,您将如何实例化它们?
static
没有“做”这些,因为它没有引用
t
?或者你只是希望一个单例能够在你的字典中存储任何可哈希键吗?以下是我的场景:我使用单例作为工具类,我希望有一个字典来存储一些实例,这些键是一种枚举。我想发送一个不确定的枚举键来获取一个实例,所以我使用Generic来匹配不确定的枚举。Hashable是字典的键必须是Hashable的。对不起,我尝试了你的建议,它也有效,但我认为Pranav Kasetti的建议更适合我。再谢谢你了!下面是我的场景:我使用Single作为工具类,我想用一个字典来存储一些实例,键是一种枚举。我想发送一个不确定的枚举键来获取一个实例,所以我使用Generic来匹配不确定的枚举。Hashable是字典的键必须是Hashable的。对不起,我尝试了你的建议,它也有效,但我认为Pranav Kasetti的建议更适合我。再谢谢你了!这将在每次访问var时创建一个新的单个实例。所以它不适合单例用例。@PranavKasetti谢谢,这确实有帮助,但我不知道为什么它会给我一个警告“通过这个函数的所有路径都将调用它自己”。有什么想法吗?每次访问var时,这会创建一个新的单例。所以它不适合单例使用。@PranavKasetti谢谢,这真的很有帮助,但我不知道为什么它会给我一个警告“通过这个函数的所有路径都会调用它自己”,有什么想法吗?