在 Swift 中将可变参数作为数组传递

Passing variadic arguments as an array in Swift

Java 5+ 允许将可变参数作为数组或单独传递。我希望 Swift 也允许将可变参数作为数组传递,但到目前为止运气不好。

这是一个示例程序,我在操场上试过。它创建一个 CVarArg 数组并将其传递给 String(format:...)

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 (String(index+1) + " " + String(format: pdata.format, pdata.param))
}

我预计:

1 This is blank
2 This is Swift language

而是打印:

1 This is blank
2 This is (
    Swift,
    language
) (null)

尝试使用 CVarArg... 作为类型:

let printData: [(format: String, param: CVarArg...)]

或桥接到 CVarArg...:[=​​18=]

String(format: pdata.format, pdata.param as CVarArg...)

在这两种情况下我都会遇到编译错误。

有没有办法更改上述代码的语法以允许以预期的方式解释 [CVarArg]。

我认为你的问题是元组不支持可变参数。所以

 (format: "This is %@ %@", param: ["Swift", "language"])

是两个元组:一个字符串和一个数组,String(format:,_) 将数组视为唯一一个对象。要解决您眼前的问题,请使用 String(format:,arguments:)。例如

for index in 0...1  {
    let pdata = printData[index]
    print (String(index+1) + " " + String(format: pdata.format, arguments: pdata.param))
}

鉴于创建文字数组是多么容易,我质疑是否需要在 Swift 中的任何地方使用可变参数。