我现在正在玩Swift。似乎除非在函数签名中使用下划线,否则Swift要求函数的调用者指定参数的名称,如下所示:
func myFunction(num:Int) -> Int {
return num * 2
}
var result = myFunction(num:5) //the caller had to use num:5, rather than 5
我可以预见的一个问题是: 假设一个新的代码样式通过软件公司分发,新的代码标准要求完整拼写参数名称,如下所示:
func myFunction(number:Int) -> Int {
return number * 2
}
然后,代码的调用者必须知道已经进行了更改,并相应地更新他们的代码:
var result = myFunction(number:5)
编写函数后,您将永远使用您最初提出的变量名称。
我的直觉是通过使用下划线来解决这个问题:
func myFunction(_ num:Int) -> Int {
return num * 2
}
这使调用者在调用变量时不必知道变量的名称:
var result = myFunction(5)
但是源代码将被强制包含下划线:
func computeVolume(_ length:Int, _ width:Int, _ height:Int) -> Int {
return length * width * height
}
我试图理解这种语言设计决策背后的原因。
答案 0 :(得分:1)
您错过了Swift功能的工作方式。有参数标签和参数名称。
编写如下函数时:
func myFunction(num: Int) {
print(num) // Uses num
}
myFunction(num: 5) // Also uses num
您正在创建一个带有一个参数的函数,其中客户端代码使用的外部标签与函数实现所使用的内部参数名称相同。
Swift允许您使用不同的名称:
func myFunction(number num:Int) {
print(num) // Still uses num
}
myFunction(number: 5) // Now uses number
标签number
基本上是函数名称的一部分。 num
是仅在函数内使用的参数名称。
_
的特殊标签表示调用者在调用函数时没有提供名称:
func myFunction(_ num:Int) {
print(num) // Still num
}
myFunction(5) // Now there is no label
一旦理解了参数标签的使用,那么您可能对此类标签进行的任何未来更改与重命名该函数的基本名称没有什么不同。任何客户端代码都需要更新。
例如,如果您从:
开头func myFunction(number num:Int) {
然后将其更改为:
func myFunction(with num:Int) {
然后该更改会影响对函数的所有调用,就像函数名中的以下更改一样:
func aFunction(number num:Int) {
但是以下更改对函数的任何调用都没有影响:
func myFunction(number aNum:Int) {
因此,简而言之,调用者实际上并不需要知道参数名称(在此示例中为num
)。调用者需要知道函数名称,其中包括未设置为_
的任何参数标签。