swift - 如何在 Swift 中为泛型类创建单例

标签 swift generics singleton

我需要在 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>()
}

最佳答案

这里的根本问题是您要创建一整套单例(每个参数化类型一个),并且每个单例都需要存储(或引用)静态上下文。并且单例需要按它们存储的类型进行索引。

我建议创建一个单一的全局字典来存储你的单例,由它们类型的字符串描述索引:

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
    }
}

关于swift - 如何在 Swift 中为泛型类创建单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43849462/

相关文章:

java - 以有用的方式转换 HashMap

swift - 在单例结构中使用 self

java - 将特定字段/变量附加到正在实现的接口(interface)

java - 线程安全单例和内部类解决方案

ios - 从 Firebase 控制台发送静默推送通知

ios - 指定 "show"(推)segue 的方向

ios - Swift 和 Sprite Kit - 如何测量 Sprite 移动的总距离?

ios - 如何将 URL 读入 AVURLAsset

java - 如何将类名传递给抽象父类(super class)构造函数?

函数参数的 typescript 复制签名