You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中为泛型Cache类创建简化别名,支持Identifiable类型

为泛型Cache类实现Identifiable类型的语法糖

可行方案:利用条件扩展+便利初始化器

保留原有的泛型Cache类,通过添加条件扩展让编译器自动为遵循Identifiable的类型推导Key类型,既实现你想要的语法糖,又保留原类处理非Identifiable类型的灵活性。

1. 保留原Cache类定义

class Cache<Key: Hashable, Value> {
    // 原有的初始化逻辑(可根据需求自定义)
    init() {}
    
    // 示例缓存操作方法
    private var storage: [Key: Value] = [:]
    
    func store(_ value: Value, forKey key: Key) {
        storage[key] = value
    }
    
    func retrieve(forKey key: Key) -> Value? {
        storage[key]
    }
}

2. 添加条件扩展实现语法糖

为Cache类添加针对Identifiable类型的便利初始化器,让编译器自动推导Key为Value.ID:

extension Cache where Value: Identifiable, Key == Value.ID {
    // 编译器会自动匹配该初始化器,推导Key为Value.ID
    convenience init() {
        self.init()
    }
}

3. 使用方式

struct User: Identifiable {
    var id: String
    var name: String
}

// 语法糖写法:自动推导Key为User.ID,Value为User
var userCache = Cache<User>()

// 原有写法依然有效,用于非Identifiable类型或自定义Key的场景
struct NonIdentifiableData {
    var code: Int
    var content: String
}
var dataCache = Cache<Int, NonIdentifiableData>()

替代方案:泛型类型别名

如果偏好更明确的命名,可以定义专门的类型别名,同样实现简洁写法:

typealias IdentifiableCache<Value: Identifiable> = Cache<Value.ID, Value>

// 使用方式
var userCache = IdentifiableCache<User>()

为什么你之前的尝试无效?

  • 同名泛型类型别名与类冲突:Swift不允许全局作用域内存在同名的泛型类和类型别名,即使泛型参数不同。
  • 泛型参数默认值无法动态依赖:你尝试的Key = Value.ID写法不符合Swift语法,泛型参数默认值必须是独立类型,不能依赖另一个泛型参数。

内容的提问来源于stack exchange,提问作者majelbstoat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:50:38