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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 22:12:14