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

Swift中如何将数组作为可变参数传入String(format:)? 对比Java 5+

解决Swift中数组作为可变参数传递给String(format:)的问题

这个问题我之前也碰到过!Swift里直接把[CVarArg]数组传给String(format:)的可变参数确实不行,原因是:可变参数(CVarArg...)虽然在函数内部会被自动处理成[CVarArg]数组,但反过来你不能直接把数组当作可变参数传入——这时候整个数组会被当作单个参数塞进第一个格式占位符里,剩下的占位符就没有对应参数填充了,所以才会出现你看到的( Swift, language ) (null)这种奇怪输出。

正确解决方案:使用String(format:arguments:)重载方法

Swift的String专门提供了适配数组参数的初始化器:init(format: String, arguments: [CVarArg]),它直接接受一个[CVarArg]数组作为参数,完全匹配你的需求。

只需要把你原代码中的String(format: pdata.format, pdata.param)改成String(format: pdata.format, arguments: pdata.param)即可,修改后的完整代码如下:

let printData: [(format: String, param: [CVarArg])] = [
    (format: "This is blank", param: []),
    (format: "This is %@ %@", param: ["Swift", "language"])
]
for index in 0...1 {
    let pdata = printData[index]
    print("\(index+1) \(String(format: pdata.format, arguments: pdata.param))")
}

运行这段代码后,输出完全符合你的预期:

1 This is blank
2 This is Swift language

为什么之前的尝试会失败?

  • let printData: [(format: String, param: CVarArg...)]:Swift不允许将可变参数类型(...)用于元组、变量或属性的类型定义中,可变参数只是函数参数的语法糖,不能作为普通类型使用。
  • pdata.param as CVarArg...:这种强制转换是不合法的,Swift没有提供把数组直接转换为可变参数的语法,必须使用专门支持数组参数的重载方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:14:10