设置默认值的特性非常有用,能够极大的增加接口函数的功能性,同时又可以使得一些使用默认参数的接口非常简便。
default subscript value
Swift 中给函数参数设置默认值比如:
代码语言:javascript复制func registerByPhone(number: String, mobileArea: Int = 86) -> Bool
Swift 将生成两个可调用函数,可以这样使用:
代码语言:javascript复制 //默认区域码为 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 以上):
代码语言:javascript复制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]
}
}
该代码与第一个示例几乎相同,除了下标现在具有默认参数。这意味着您可以按示例这样使用下标:
代码语言:javascript复制let item = grid[y: 2]
这将自动为x
参数调用默认值为0
的下标,这个和函数的默认参数的表现形式一致。