在Swift中使用函数参数名称

时间:2014-07-10 15:40:03

标签: swift

在Swift中,在调用方法时使用参数名称,第一个参数除外。为什么不使用名字?

使用Swift手册中的变体;

var count2: Int = 0
func incrementBy2(amount: Int, numberOfTimes times: Int) {
count2 += amount * times}

这将有效;

incrementBy2(2, numberOfTimes: 7)

然而,这给了我"无关的参数标签'金额'在电话"

incrementBy2(amount: 2, numberOfTimes: 7)

我是否有这样的原因,或者它是其中之一"只是它的方式"东西?

5 个答案:

答案 0 :(得分:17)

这是遵循我们从Objective-C习惯的惯例,其中第一个参数的名称与方法名称相结合。这是一个例子:

- (void)incrementByAmount:(NSInteger)amount
            numberOfTimes:(NSInteger)times
{
    // stuff
}

您可以调用以下方法:

[self incrementByAmount:2 numberOfTimes:7];

通过将参数的名称合并到方法的名称中,读取感觉更自然。在Swift中,您可以通过以下方式实现相同的目标:

func incrementByAmount(amount: Int, numberOfTimes: Int) {
    // same stuff in Swift
}

并调用方法如:

incrementByAmount(2, numberOfTimes: 7)

如果您不想使用此约定,Swift使您能够更明确地定义单独的内部和外部参数名称,如下所示:

func incrementByAmount(incrementBy amount: Int, numberOfTimes: Int) {
    // same stuff in Swift
    // access `amount` at this scope.
}

你可以这样调用这个方法:

incrementByAmount(incrementBy: 2, numberOfTimes: 7)

答案 1 :(得分:5)

在您的示例中,您没有为第一个参数设置名称。您只有变量名。

请尝试以下:

func incrementBy2(amount am: Int, numberOfTimes times: Int) {
}

所以你可以把它称为

incrementBy2(amount: 0, numberOfTimes: 0)

am将是函数内部变量的名称。 amount将是一个外部名称。

如果你想要相同的外部名称和变量,你可以试试这个:

func incrementBy2(amount amount: Int, numberOfTimes times: Int) {
}

仍然像

一样打电话

incrementBy2(amount: 0, numberOfTimes: 0)

更多信息功能参数名称在Apple的The Swift Programming Language

上指定外部参数名称章节

答案 2 :(得分:3)

  

Swift中的方法与其中的方法非常相似   Objective-C的。与Objective-C一样,是Swift中方法的名称   通常是指使用介词的方法的第一个参数   例如with,for或by,如在incrementBy方法中看到的那样   前面的Counter类示例。使用介词可以实现   在被调用时被读作句子的方法。斯威夫特做到这一点   建立的方法命名约定易于使用a   方法参数的默认方法与其使用的方法不同   功能参数。

     

具体来说,Swift默认情况下在方法中为第一个参数名称提供本地参数名称,并给出第二个和后续参数   默认情况下,参数名称为本地和外部参数名称。   此约定与您的典型命名和调用约定相匹配   熟悉编写Objective-C方法,并为之做好准备   表达方法调用,无需限定参数   名。

摘自:Apple Inc.“The Swift Programming Language。”iBooks。 https://itun.es/ru/jEUH0.l

答案 3 :(得分:2)

为了更新最新版本的Swift的答案,使用#强制使用函数的第一个命名参数已从语言中删除。为了指定外部参数名称,您现在只需使用空格将外部名称与内部名称分开。 #以前用于指示内部和外部具有相同名称的参数,但现在您必须在函数定义中将参数名称加倍才能实现此目的:

var count2: Int = 0
func incrementBy2(amount amount: Int, numberOfTimes times: Int) {
  count2 += amount * times
}
incrementBy2(amount: 2, numberOfTimes: 7) // result is 14

为了清晰起见,您还可以区分名称:

var count2: Int = 0
func incrementBy2(theValue amount: Int, numberOfTimes times: Int) {
  count2 += amount * times
  }
incrementBy2(theValue: 2, numberOfTimes: 7)

或者只是按照Objective-C方式进行,并明确第一个参数应该是什么:

var count2: Int = 0
func incrementBy2TheValue(amount: Int, numberOfTimes times: Int) {
  count2 += amount * times
}
incrementBy2TheValue(2, numberOfTimes: 7)
但是,我不确定人们对函数名称中数字的看法。但我意识到这只是一个例子。

答案 4 :(得分:1)

它只使用与目标C相同的模式,其中方法具有命名参数,第一个除外,它由方法名称本身定义。例如

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

您可以通过显式添加名称或在参数名前加上哈希#字符,将第一个参数转换为命名参数。

顺便说一下,在目标C中,方法签名是方法名称​​加上所有命名参数,例如:

- (void) addUser:(User *)user toArray:(NSMutableArray *)array

不同于:

- (void) addUser:(User *)user toDict:(NSMutableDictionary *)dict

与其他语言(C#,Java等)非常相似:

void addUser(User user, Array array)

不同于:

void addUser(User user, Dictionary dict)