天天看點

Swift 5.2 給下标設定預設值

設定預設值的特性非常有用,能夠極大的增加接口函數的功能性,同時又可以使得一些使用預設參數的接口非常簡便。

Swift 5.2 給下标設定預設值

default subscript value

Swift 中給函數參數設定預設值比如:

func registerByPhone(number: String, mobileArea: Int = 86) -> Bool            

複制

Swift 将生成兩個可調用函數,可以這樣使用:

//預設區域碼為 86
registerByPhone(number: "188****8888")   

//設定區域碼為10
registerByPhone(number: "188****8888", mobileArea: 10)            

複制

在Swift中定義自定義下标的功能非常強大。它使我們能夠編寫非常自然和簡潔的代碼。但是在Swift 5.2 之前,下标值是不支援設定預設值的,比如這個帶有自定義下标的

Grid

示例:

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中我們可以為下标參數提供預設值 (需要Xcode 11.4 beta 以上):

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

參數調用預設值為

的下标,這個和函數的預設參數的表現形式一緻。