在Swift函数签名中:的含义是什么?为什么似乎应该有逗号,但却没有逗号?
下面是我所说的一个例子: 插入功能显示为在Swift函数签名中:的含义是什么?为什么似乎应该有逗号,但却没有逗号?,swift,Swift,下面是我所说的一个例子: 插入功能显示为insert(u:at:) 实际使用时,插入函数看起来更像: namesArray.insert(“John”,at:3) 在“John”之后没有:(虽然我想它可能是“John”:String——这就是它的用途吗?),文档中的函数签名中没有提到实际需要用到的,。当我实际使用逗号时,我是否应该知道/假设逗号在那里?所有Swift功能都是这样吗 请注意,这不是一个关于下划线的问题,。——我理解它为什么在那里以及它的用途。我特别询问在函数签名中包含:和不包含,的
insert(u:at:)
实际使用时,插入函数看起来更像:
namesArray.insert(“John”,at:3)
在“John”
之后没有:
(虽然我想它可能是“John”:String
——这就是它的用途吗?),文档中的函数签名中没有提到实际需要用到的,
。当我实际使用逗号时,我是否应该知道/假设逗号在那里?所有Swift功能都是这样吗
请注意,这不是一个关于下划线的问题,
。
——我理解它为什么在那里以及它的用途。我特别询问在函数签名中包含:
和不包含,
的原因。A:
在函数签名中始终表示函数的输入参数。函数签名包含参数标签,后跟一个:
。\uu
表示没有参数标签,在这种情况下,在向函数调用提供特定输入参数时,也可以省略:
这正是您在
insert(:at:)
函数中看到的。您为它提供了两个输入参数,“John”
和3
,但它只需要第二个输入参数的参数标签,因此您只需要一个:
。还需要注意的是,在调用时,您可以使用,
,而不是:
分隔输入参数。Swift函数有一种指定签名的独特方式,这是目标C的一种结转模式。为函数签名指定每个输入参数有三个部分。您提到的功能的签名如下:
func insert(_ objects: [Any],
at indexes: IndexSet)
让我们先看看第二个论点:
at
指示参数标签,这是调用者指定参数的方式索引
向对象指示函数的参数名称。这意味着在函数体中,在:处作为传递的内容将被称为索引
IndexSet
是参数的类型- 如果未指定,则参数名称和参数标签相同。例如,如果签名是
,则该函数将被称为func-insert(objects:[Any],index:IndexSet)
o.insert(objects:[a','b'],at:[1,2])
- 如果它是一个下划线(
),则该参数没有调用者的标签。这允许调用者使用更简单、直观的调用\uu
o.insert(['a','b'],at:[1,2])
请考虑此函数声明:
func insert(_ objects: [Any], at indexes: IndexSet)
这是
- 一个名为
的方法李>insert
- 第一个参数名被称为
,该参数没有参数标签(用对象
指定),其类型为
;及[Any]
- 第二个参数名是
,它的参数标签是索引
处,类型为在
索引集
insert(someObjects, at: someIndex)
调用它时,您不关心该函数中使用的参数名称,而只关心参数标签是什么。因此,在文档中引用该方法时,惯例是省略参数名和类型,只使用函数名和参数标签,而不使用逗号:
insert(_:at:)
注意,您在代码中从未实际使用过这种语法。这只是一种文档约定,用于将长函数声明提取为更易于管理和简洁的内容:
有关参数标签和参数名称的详细信息,请参见签名中的冒号将参数名称与其值分隔开。功能具有以下特点:
func functionName(label1 parameter1: Type1, label2 paramter2: Type2) -> ReturnType {
...
}
其中标签是调用函数时看到的名称,参数是函数体中使用的值的名称。当调用参数时,\u
的标签将从参数中删除标签
调用函数时,冒号只是将参数标签与传递给函数的值分开。逗号分隔不同的参数。没有标签的参数不需要冒号。以下函数将完全没有冒号:
func myFunc(_ par1: Int, _ par2: String) {
print(par1, par2)
}
myFunc(3, "what") // 3 "what"
这只是一个符号!这是语言设计者选择的惯例。问为什么就像问为什么触地得分是6分。这就是游戏规则,这就是为什么。没有什么可以解释的。为什么我们使用
()
而不是
来包围函数参数?为什么我们使用“
而不是^
来包围字符串文字?因为这些是语言的规则。谢谢大卫!因此,我认为这里的答案是,逗号在调用时包括在内,但在函数签名中没有提到——对吗?@Matvey基本上是的,您调用的绑定
被称为参数名
,没有函数标签
,但是参数标签
s.@DávidPásztor-从技术上讲,虽然调用函数时提供的标签称为参数(即“参数标签”),但函数中引用的是参数(因此称为“参数名称”).见。谢谢你,罗布,这就解释了!附言。你是如何在底部创建漂亮的gif的?我作弊了:用神奇的移动做基调演示,用QuickTime捕捉,然后转换成gif。我只是想说明w