我需要编写类似以下内容的代码:

var dict = [SomeEnum: SomeObject]()
var someValue: SomeObject! = dict[.case1]
if someValue == nil {
  someValue = someDefaultValue
  dict[.case1] = someValue
}

Nil-coalescing运算符已经存在,但它不会改变原始字典.dict[.case1, default: someDefaultValue也是如此.

您能解释一下如何编写一个新的下标/运算符来包装上面的代码吗?

推荐答案

通过使用关键字subscript而不是关键字func声明新方法,可以创建自定义子脚本.

根据您的要求,您似乎只需要您的自定义下标具有一个getter,而不需要为它设置一个setter-您可以使用默认的setter来设置值.

extension Dictionary {
  /// Subscript which returns the previously set `Value` for `key` in case such value exists.
  /// Otherwise, sets `defaultValue` as the value for `key` and returns `defaultValue`.
  subscript(_ key: Key, defaultValue defaultValue: Value) -> Value {
    mutating get {
      // In case the dictionary already contained a value for key, return the existing value
      if let value = self[key] {
        return value
      } else { // Otherwise, set the key to have defaultValue as its value and return defaultValue
        self[key] = defaultValue
        return defaultValue
      }
    }
  }
}

使用示例:

let defaultValue = "default"
var dict = [Int:String]()
dict[0] = "0"
dict[2] = "2"
let valueFor1 = dict[1, defaultValue: defaultValue] // "default"
print(dict) // [0: "0", 1: "default", 2: "2"]
dict[2, defaultValue: defaultValue] // this returns 2 as the key had a previously set value

Swift相关问答推荐

try 在SwiftUI中做5星评级

是否在字符串属性上搜索数组和子数组?

为什么枚举上的.allCases.forEach不是循环(继续和中断不起作用)?

如何使用变量 Select 哪个向量(?)在我的 struct 中密谋吗?

如何在应用程序区域永久更改 NSCursor?

在扩展中创建通用排序函数

在 SwiftUI 中禁用 Select 器选项

如何从 RC 加载场景作为 ModelEntity 而不是普通实体?

使用 swift 的 Firebase 身份验证

如何在 Combine 合并运算符的输出上使用 eraseToAnyPublisher

签署GoogleSignIn-GoogleSignIn需要开发团队

Swift 非参与者隔离闭包

来自数据的 SwiftUI 图像

如何在 RxSwift 中获取 controlEvent 类型?

Vapor 4,如何按外键过滤?

我如何从 UIAlertController 导航到新屏幕(swiftUI)

更新我的 pod 导致 GoogleDataTransport Umbrella 标头出现错误

在 Swiftui 中是否有一种简单的方法可以通过捏合来放大图像?

Facebook SDK 4.0 IOS Swift 以编程方式注销用户

将 [String] 存储在 NSUserDefaults 中