Swift:如何实现可添加默认值并修改原字典的下标/运算符?
实现字典的“取值并自动插入默认值”自定义下标
你需要的是读取字典值时,若对应key不存在则自动插入默认值并返回该值的逻辑——原生的??空合运算符和dict[key, default:]下标都只会返回默认值但不会修改原字典,因此可以通过扩展Dictionary实现自定义下标来封装这个逻辑。
实现代码
extension Dictionary { // 自定义下标:读取时自动插入默认值到字典 subscript(default defaultValue: @autoclosure () -> Value, for key: Key) -> Value { mutating get { // 检查key是否已存在 if let existingValue = self[key] { return existingValue } // 生成默认值并插入字典 let newDefaultValue = defaultValue() self[key] = newDefaultValue return newDefaultValue } // 保留普通下标赋值能力 set { self[key] = newValue } } }
代码说明
@autoclosure:延迟默认值的计算,只有当key不存在时才会执行默认值的生成逻辑,避免不必要的性能开销(比如默认值是创建新对象的场景)mutating get:因为需要修改字典本身,所以getter必须标记为mutating- 逻辑流程:先尝试读取已有值→不存在则生成默认值并插入字典→返回对应值
使用示例
// 模拟你的枚举和对象类型 enum SomeEnum { case case1 } class SomeObject {} // 初始化字典和默认值 let someDefaultValue = SomeObject() var dict = [SomeEnum: SomeObject]() // 使用自定义下标 let someValue = dict[default: someDefaultValue, for: .case1] // 此时dict[.case1]已被自动设置为someDefaultValue
可选优化:更简洁的调用语法
如果觉得参数名冗余,也可以调整下标定义,让调用更紧凑:
extension Dictionary { subscript(default value: @autoclosure () -> Value, _ key: Key) -> Value { mutating get { if let val = self[key] { return val } let newVal = value() self[key] = newVal return newVal } set { self[key] = newValue } } } // 调用方式简化为 let someValue = dict[default: someDefaultValue, .case1]
内容的提问来源于stack exchange,提问作者Gargo
相关产品推荐
相关产品推荐

