Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Swift中为泛型类生成单例_Swift_Generics_Singleton - Fatal编程技术网

如何在Swift中为泛型类生成单例

如何在Swift中为泛型类生成单例,swift,generics,singleton,Swift,Generics,Singleton,我需要为Swift中的泛型类创建一个单例,但是Swift中的泛型类不支持静态存储属性,那么这个方法无效 public final class ApiClient<T>: ApiClientFor<T> where T:EntityType { // Method 1 class var shared: ApiClient<T> { struct Static {

我需要为Swift中的泛型类创建一个单例,但是Swift中的泛型类不支持静态存储属性,那么这个方法无效

 public final class ApiClient<T>: ApiClientFor<T> where T:EntityType {        

        // Method 1

       class var shared: ApiClient<T> {
            struct Static {
                static let instance = ApiClient<T>()
            }
            return Static.instance
        }

        //Or more simple Method 2

       static let instance = ApiClient<T>()
}
public final类ApiClient:apiclientforwhere T:EntityType{
//方法1
类var共享:ApiClient{
结构静态{
静态let实例=ApiClient()
}
返回Static.instance
}
//或者更简单的方法2
静态let实例=ApiClient()
}

这里的基本问题是,您正在创建一个完整的单例家族(每个参数化类型一个),每个单例都需要存储(或引用)静态上下文。单例需要根据存储的类型进行索引

我建议创建一个单独的全局字典,在其中存储您的单例,并通过其类型的字符串描述进行索引:

var singletons_store : [String, AnyObject]
然后在计算的
shared
变量中,在该存储中查找对应于参数化类型的单例:

class var shared : APIClient<T> {
    let store_key = String(describing: T.self)
    if let singleton = singletons_store[store_key] {
        return singleton as! APIClient<T>
    } else {
        let new_singleton = APIClient<T>()
        singleton_store[store_key] = new_singleton
        return new_singleton
    }
}
class-var-shared:APIClient{
let store_key=String(描述:T.self)
如果让singleton=singleton\u存储[store\u key]{
将单例返回为!APIClient
}否则{
让new_singleton=APIClient()
单件存储[存储密钥]=新单件
返回新单例
}
}
可能的重复,