Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift函数签名中:的含义是什么?为什么似乎应该有逗号,但却没有逗号?_Swift - Fatal编程技术网

在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
    是参数的类型
  • 部分1也可以是名称以外的内容:

    • 如果未指定,则参数名称和参数标签相同。例如,如果签名是
      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