天天看点

在Swift 5.2中为下标参数添加默认值

由donnywals于2020年2月19日发布

在Swift中定义自定义下标的功能非常强大,Swift下标的用法参考:《Swift语言入门实例教程》第5章第3节:Swift的结构(struct)类型及其下标(subscript), 下标使我们能够编写非常自然和简洁的代码。 考虑以下带有自定义下标的网格示例:

struct Grid {
  let items : [[GridItem]]

  subscript(x x: Int, y y: Int) -> GridItem? {
    guard !items.isEmpty, (items.startIndex...items.index(before: items.endIndex)).contains(x)
      else { return nil }

    let row = items[x]

    guard !row.isEmpty, (row.startIndex...row.index(before: row.endIndex)).contains(y)
      else { return nil }

    return row[y]
  }
}
           

请注意,默认情况下,下标不使用标签。 要使下标使用标签,您需要像在上面的代码中一样手动声明下标标签两次(x x:Int和y y:Int)。 像上面这样的下标将按如下方式使用:

let item = grid[x: 10, y: 2]
           

这个示例在Swift 5.1和Swift的早期版本中可以正常工作。 Swift 5.2中的新功能是能够为下标参数提供默认值:

struct Grid {
  let items : [[GridItem]]

  subscript(x x: Int = 0, y y: Int = 0) -> GridItem? {
    guard !items.isEmpty, (items.startIndex...items.index(before: items.endIndex)).contains(x)
      else { return nil }

    let row = items[x]

    guard !row.isEmpty, (row.startIndex...row.index(before: row.endIndex)).contains(y)
      else { return nil }

    return row[y]
  }
}
           

该代码与第一个示例几乎相同,除了下标现在具有默认参数。 这意味着您可以按如下方式使用下标:

let item = grid[y: 2]
           

这将自动为x参数调用默认值为0的下标。

老实说,以前不可能在Swift中定义默认下标参数这一事实令我感到惊讶,但我很高兴我们现在有这种可能性。 我认为这将使许多人为自己的对象编写更好的下标。

译自:https://www.donnywals.com/adding-default-values-to-subscripts-in-swift-5-2/

继续阅读