在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)
我是否有这样的原因,或者它是其中之一"只是它的方式"东西?
答案 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)