Objective c 什么';Swift参考资料中的下划线代表什么?

Objective c 什么';Swift参考资料中的下划线代表什么?,objective-c,function,swift,declaration,Objective C,Function,Swift,Declaration,在苹果文档的参考部分,有很多这样的例子: func运行操作(action:SKAction!) 这方面的目标C“等价物”是: -(void)runAction:(SKAction*)action 让我印象深刻的是,(在Swift引用中)下划线和“action”后面用斜体写一个空格可能很重要 但我不明白这是什么意思。所以也许问题是。。。参考文献中使用的约定是否有参考文献 --以下是我在引用下划线时引用的页面: 更新 Swift 3对函数/方法参数名称和参数标签的使用和命名方式进行了一些更改。这对

在苹果文档的参考部分,有很多这样的例子:

func运行操作(
action
:SKAction!)

这方面的目标C“等价物”是:

-(void)runAction:(SKAction*)
action

让我印象深刻的是,(在Swift引用中)下划线和“action”后面用斜体写一个空格可能很重要

但我不明白这是什么意思。所以也许问题是。。。参考文献中使用的约定是否有参考文献

--以下是我在引用下划线时引用的页面:

更新
Swift 3对函数/方法参数名称和参数标签的使用和命名方式进行了一些更改。这对这个问题及其答案产生了影响@Rickster在回答一个关于函数中下划线的不同问题方面做了一个惊人的工作,这个问题可以清除大部分内容,这里:

下划线是一个通用标记,用于指示被丢弃的值

在这种特定情况下,这意味着函数将作为
runAction(argument)
调用,而不是
runAction(action:argument)

在其他上下文中,它具有其他类似含义,例如:

for _ in 0..<5 { ... }

这意味着我们不关心元组的第二个元素是什么,只关心第一个元素。

参数声明前面的标识符定义了外部参数名。这是调用函数时调用方必须提供的名称:

func someFunction(externalParameterName localParameterName: Int)
如果您自己不提供外部名称,Swift将为您定义的任何默认参数提供自动外部名称。使用下划线作为外部参数名称可选择此行为:

定义参数时,您可以通过写下划线(
\uu
)而不是显式外部名称来选择退出此行为


您可以在带有默认值的参数的外部名称一节中了解有关此行为的更多信息。

两个答案都是正确的,但我想进一步澄清

\
用于

在文件的一节中,它说:

Swift默认为方法中的第一个参数名提供本地参数名,默认为第二个和后续参数名提供本地和外部参数名

另一方面,默认情况下,函数没有外部参数名

例如,我们在类
Bar
中定义了这个
foo()
方法:

class Bar{
    func foo(s1: String, s2: String) -> String {
        return s1 + s2;
    }
}
当您调用
foo()
时,它的调用类似于
bar.foo(“Hello”,s2:“World”)

但是,您可以通过在声明该行为的
s2
前面使用
\ucode>来覆盖该行为

func foo(s1: String, _ s2: String) -> String{
    return s1 + s2;
}
然后,当您调用
foo
时,它可以像
bar.foo(“Hello”,“World”)
那样简单地调用,而不需要第二个参数的名称

回到您的案例,
runAction
是一种方法,因为它显然与类型
SKNode
关联。因此,在参数
action
之前放置
,允许您在不使用外部名称的情况下调用
runAction

Swift 2.0的更新

函数和方法现在的工作方式与本地和外部参数名称声明的工作方式相同

现在,从第二个参数开始,默认情况下使用外部参数名调用函数。此规则仅适用于纯Swift代码


因此,通过在函数前面提供
,调用者将不必指定外部参数名称,就像对方法所做的那样,我认为这将强制使用Swift中的约定,使其更接近objective-c,从而更好地匹配cocoa约定。在objc中,您不(从外部)命名第一个参数。相反,按照惯例,通常在方法名称的后面部分包含外部名称,如下所示:

- (void)myFancyMethodWithFirstName:(NSString *)aFirstName lastName:(NSString *)aLastName;

[someInstance myFancyMethodWithFirstName:@"John" lastName:@"Doe"];
要使Swift api调用与objc一致,您需要抑制第一个参数的外部参数名

func myFancyMethodWithFirstName(_ firstName:String, lastName:String);

someInstance.myFancyMethodWithFirstName("John", lastName:"Doe")

实际上,用于定义方法的实际代码与苹果文档中的方法声明之间存在差异。让我们看一下UIControl -addTarget:action:forControlEvents:method例如,实际代码是:

但在文档中,它是这样出现的(注意uu在目标之前):

在实数代码中,\用于生成第二个或后续参数的外部名称 调用方法时不显示,而在文档中,参数的本地名称之前的表示调用方法或函数时,不应提供外部名称。

默认情况下调用函数时没有外部名称,除非您在参数的本地名称之前(不带空格)提供自己的名称或添加#,例如,我们在以下情况下使用dispatch#u:

在文档中,它是这样出现的(注意三点):

函数声明的约定与我描述的方法相同。

更直观


正如您可以看到的那样,
\uu
只需使省略本地参数名或不省略本地参数名。

因为Swift 3所有参数标签都是默认值所必需的

您可以使用
强制IDE隐藏参数标签

func foo(a: String) {
}

func foo2(_ a: String) {
}
称为
foo(a:“abc”)
foo2(“abc”)

注意:只有当
a
同时是(外部)参数标签和(内部)变量名称时,才能使用此选项。它是等效的-
func-foo(a:String)
不会接受
\uu

func foo(a: String) {
}

func foo2(_ a: String) {
}
苹果为什么要用它? 你可以看到苹果正在API中使用它。苹果的库仍然是用Objective-C编写的(如果不是的话,它们是共享的)