You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift函数调用报Extraneous argument label 'number:' in call错误咨询

Swift调用函数报Extraneous argument label 'number:' in call的原因

这个错误本质是Swift对直接调用具名函数和调用作为值传递的函数类型实例的参数标签规则不一样:

  • 你在makeIncrementer内部定义的嵌套函数addOne(number:),直接在当前作用域调用addOne(number: 7)是完全合法的——因为直接调用具名函数时,Swift默认会把参数的内部名作为外部参数标签使用。
  • 当你把addOne作为返回值返回、赋值给increment变量时,increment的类型是(Int) -> Int,这个函数类型只记录了「接收一个Int类型参数、返回Int类型值」的信息,没有保留原函数的number参数标签。
  • 所有函数类型的实例调用时,默认必须省略所有参数标签,你加了number:标签就会触发参数多余的报错。

修正后的可运行代码

func makeIncrementer() -> ((Int) -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
increment(7) // 去掉参数标签即可正常执行,运行结果为8

补充说明

如果有特殊需求必须让返回的函数调用时携带number:参数标签,你需要在声明函数返回类型时显式标注参数标签,写法如下:

// 显式给返回的函数类型标注参数标签
func makeIncrementer() -> ((number: Int) -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
increment(number: 7) // 此时带标签调用不会报错

日常开发中不推荐给函数类型标注参数标签,Swift标准库中所有闭包、传递的函数值默认都采用无标签调用的写法,保持统一即可。

内容的提问来源于stack exchange,提问作者RebirthQ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:33:07