首页 / Swift 编程语言教程 / 参数标签与参数名

Swift 编程语言教程

参数标签与参数名

本教程共 93 篇 · 第 29 篇 · 更新于 2026-08-08 · 约 8 分钟阅读

SwiftSwift 编程语言教程参数标签参数名argument labelparameter name省略标签函数可读性

本节目标:分清函数的“参数标签”和“参数名”各是干嘛的,并学会自定义标签、用下划线省略标签,让函数调用读起来像一句话。

Swift 函数参数的设计有个很贴心的细节:每个参数其实有两套名字。一套叫“参数标签”(argument label),是调用函数时写在实参前面的;另一套叫“参数名”(parameter name),是函数体内部用来引用这个值用的。默认情况下,两者是同一个词,但你可以把它们拆开,让“外面读着顺、里面用着准”。

1-1 默认:标签和名字是同一个

最普通的情形,参数只写一个名字,它既是标签也是名字。

func someFunction(firstParameterName: Int, secondParameterName: Int) {
    // 函数体内用 firstParameterName、secondParameterName 引用
}
someFunction(firstParameterName: 1, secondParameterName: 2)

调用时写 firstParameterName: 1,函数体里也用 firstParameterName 拿到这个值。所有参数名必须唯一;虽然多个参数能共用同一个标签,但标签最好各不相同,调用才清楚。

Note

Swift 故意要求调用时带上标签(第一个参数也不例外),这点和 Objective-C 一脉相承,好处是调用处本身就像一句完整的话,不用跳回定义去猜每个位置是什么意思。

1-2 自定义参数标签

想让调用更顺口,就在参数名前面另写一个标签,中间空格隔开。标签只影响调用写法,函数体内仍用参数名。

func greet(person: String, from hometown: String) -> String {
    return "你好 \(person)!很高兴你从 \(hometown) 来访。"
}
print(greet(person: "Bill", from: "Cupertino"))

这里 from 是标签,hometown 是函数体里用的名字。调用写成 greet(person: "Bill", from: "Cupertino"),读起来像“从 Cupertino 来的 Bill 向你问好”。而函数体内部关心的只是 hometown 这个具体值,命名可以很技术化。

Tip

经验:标签面向“读代码的人”,要自然;参数名面向“写函数体的人”,要准确。两者分工不同,必要时大胆拆开,函数的可读性会明显提升。

1-3 用下划线省略标签

有些参数在调用处写标签反而啰嗦,比如第一个参数常能靠位置自明。这时用下划线 _ 代替标签,调用时就不必写标签。

func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
    // 函数体内仍用 firstParameterName
}
someFunction(1, secondParameterName: 2)

1 直接喂给第一个参数,后面 secondParameterName: 2 仍带标签。常见于数学运算或构造器,比如 add(3, 4)add(left: 3, right: 4) 更利落。

Warning

一旦你给参数定义了标签,调用时就必须带上它,不能省略。只有显式写了 _ 的参数,调用才不用标签。别指望“有时写有时不写”,那会编译报错。

1-4 标签如何影响函数身份

Swift 区分函数不只看名字,还看参数标签。两个函数即便都叫 greet,只要标签组合不同,就是两个不同函数。

func greet(_ name: String) { print("嗨 \(name)") }
func greet(person name: String) { print("你好 \(name)") }

第一个调用 greet("小明"),第二个调用 greet(person: "小明"),编译器靠标签选对哪个。这正是后面“函数重载”能够成立的基础之一:仅靠标签不同就能区分同名函数。

1-5 标签设计的一些讲究

第一,标签要补全语义,而不是重复参数名。比如参数名是 text,标签用 withcontaining 比再写一遍 text 更清楚。

第二,别为了省事全用 _。全省略标签的函数,调用处会变成一串位置参数,读起来要回头查定义才知道每个数是啥。除非像 +- 这类一眼就懂的运算,否则保留标签更安全。

第三,标签顺序就是调用顺序,不能打乱。标签让你不必死记位置,但调用时仍要按定义顺序传,Swift 不支持“乱序传参”。

Note

初学者常纠结“到底要不要标签”。一个简单判断:如果这个参数单独出现时意思不完整(比如只写 3 不知道是宽度还是高度),就给它一个标签。标签是 Swift 表达力的来源之一,善用它能写出自解释的代码。

1-6 小结

记住这张对应关系:标签 = 调用时写在值前面的词,参数名 = 函数体里引用的变量名。两者默认相同,可用 标签 名字: 拆开,也可用 _ 让标签消失。把标签和名字用对了,你的函数调用会读起来像人话,这也是 Swift API 设计的一贯美学。

1-7 标签取舍的实用直觉

标签设计没有死规矩,但有手感。一个常错的例子:参数名是 index,标签也写 index:,调用变成 find(index: 3)——其实还行;但如果语义是“在第几个位置”,标签用 at: 更自然:find(at: 3)。标签要补参数名没说清的那层意思,而不是复述参数名。

另一个直觉:当函数有多个同类型参数时,标签几乎必须保留。比如 move(from: a, to: b)move(a, b) 安全太多——后者传反了编译器发现不了,前者传反了人一眼看出来。类型相同的相邻参数,是最该用标签守护的地方,别为了省几个字把安全丢掉。

1-8 标签不是装饰,是契约

参数标签本质上是函数对外的一份“调用契约”:它约定了调用者该怎么把值递进来。一份清楚的契约,让调用处不用翻定义就懂每个参数是干什么的。

这也解释了为什么 Swift 坚持第一个参数通常也要写标签(除非你显式用 _)。在 Objective-C 时代,方法名本身就包含了参数含义;Swift 把这种“自解释”的优良传统继承到了函数上。标签写得好,代码读起来像散文;写不好就像电报——能跑,但费脑。

所以别把标签当成可有可无的语法糖。它是你和未来的自己、和读代码的人之间的约定。花几秒钟想一个贴切的标签,省下的是所有人以后每次调用时的猜测成本。

另外,标签也影响 IDE 自动补全和文档生成——好的标签让提示更友好,别人用你的代码时一眼就懂。

这也是标签设计的精髓所在:用最少的字,补全最多的语义。理解了参数标签,下一章我们看另外三种让函数更灵活的玩法:默认参数值、可变参数和 in-out 参数。