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
相关产品推荐
相关产品推荐

