下面是我在谈论的一个例子:https://developer.apple.com/documentation/foundation/nsmutableorderedset/1410287-insert
插入功能被示出为insert(_:at:)
当它的实际使用,插入功能看起来更像是:
namesArray.insert("John", at: 3)
有后:
没有"John"
(虽然我想这可能是"John":String
- 是什么它的存在呢?),而实际需要去那里的文档中的函数签名没有提到,
。我只是应该知道/假定逗号去那里当我真正使用它?这是所有斯威夫特功能的情况下?
请注意,这不是一个关于下划线,_
的问题 - 我明白为什么它的存在以及它的对。我专门问了原因,包括:
和不包括在函数签名,
。
该公约,经常出没于文档,是指一个函数,只使用函数名和参数标签的简洁的方式。
所以考虑这个函数的声明:
func insert(_ objects: [Any], at indexes: IndexSet)
这是
insert
方法;objects
,这个参数没有参数的标签(与_
指定),并有一个类型[Any]
的;和indexes
,它的参数标记是at
并且具有类型IndexSet
的。所以你怎么称呼它,像这样:
insert(someObjects, at: someIndex)
当你调用它,你不关心什么是函数中使用的参数名称,而只是什么参数标签。所以,在文件指的是方法时的惯例是省略该参数名称和类型,只是使用函数名和参数的标签,但没有逗号:
insert(_:at:)
请注意,在你的代码,你从来没有真正使用此语法。这仅仅是用来提炼长函数声明下来的东西更易于管理和简洁的一个文档约定:
有关参数标签和参数名称的详细信息,请参阅Function Argument Labels and Parameter Names
在函数签名甲:
总是意味着的输入自变量的功能。函数签名包含参数标签后跟一个:
。该_
意味着没有参数的标签,在这种情况下提供特定的输入参数的函数调用时,你可以省略:
为好。
这正是你与insert(_:at:)
功能看。你提供两个输入参数给它,"John"
和3
,但它只需要第二个输入参数的参数标签,因此你只需要一个:
。同样重要的是要注意,在通话时,您可以使用,
分开输入参数,不:
。
迅速函数具有指定签名,这是在从目的C.图案进位有3份到指定各输入参数传递给函数签名的独特方式。你提到的函数签名如下:
func insert(_ objects: [Any],
at indexes: IndexSet)
让我们来看看第二个参数第一:
at
指示参数的标签,这是主叫方如何指定参数。indexes
表示函数的参数名称的对象。这意味着,在功能,无论是作为at:
通过的身体会被称为indexes
。IndexSet
是参数的类型。第1部分可除了一个名字的东西,太:
func insert(objects: [Any], indexes: IndexSet)
,该函数将被称为o.insert(objects: ['a','b'], at: [1,2])
。_
),那么参数对调用者没有标签。这允许使用更简单,直观的通话o.insert(['a','b'], at: [1,2])
来电。在签名,冒号分隔其值的参数的名称。功能有这样的解剖:
func functionName(label1 parameter1: Type1, label2 paramter2: Type2) -> ReturnType {
...
}
其中标签是调用函数和参数时看到的名称是值的名称作为函数的主体中使用。 _
的标签去除调用它在参数标签。
当调用一个函数,结肠简单的区分传递给函数的值参数的标签。逗号分隔不同的参数。未打标签的参数不需要冒号。下面的函数将不得不完全没有冒号:
func myFunc(_ par1: Int, _ par2: String) {
print(par1, par2)
}
myFunc(3, "what") // 3 "what"