一尘不染

带有args的Swift函数…传递给带有args的另一个函数

swift

我有一个简单的问题。我曾尝试在许多博客中搜索有关此问题的信息,但所有站点都返回了如何快速运行功能,但我需要这种情况。

我的自定义函数是:

func getLocalizeWithParams(args:CVarArgType...)->String {
     return NSString.localizedStringWithFormat(self, args); //error: Expected expression in list of expressions
}

如何通过args将args传递给其他系统函数?

谢谢前进。


阅读 329

收藏
2020-07-07

共1个答案

一尘不染

与(Objective-)C中类似,您不能将变量参数列表直接传递给另一个函数。您必须创建一个CVaListPointer
(与va_listC语言中的Swift等效)并调用一个带有CVaListPointer参数的函数。

所以这可能是您要寻找的:

extension String {
    func getLocalizeWithParams(args : CVarArgType...) -> String {
        return withVaList(args) {
            NSString(format: self, locale: NSLocale.currentLocale(), arguments: $0)
        } as String
    }
}

withVaList()``CVaListPointer从给定的参数列表创建一个,并以该指针作为参数调用闭包。

示例(来自NSString文档):

let msg = "%@:  %f\n".getLocalizeWithParams("Cost", 1234.56)
print(msg)

美国地区的输出:

Cost:  1,234.560000

德语语言环境的输出:

Cost:  1.234,560000

更新:Swift 3/4/5开始, 可以将参数传递给

String(format: String, locale: Locale?, arguments: [CVarArg])

直:

extension String {
    func getLocalizeWithParams(_ args : CVarArg...) -> String {
        return String(format: self, locale: .current, arguments: args)
    }
}
2020-07-07