带args的Swift函数...使用args传递给另一个函数

时间:2015-04-01 20:11:47

标签: swift arguments args

我有一个简单的问题。我尝试在很多博客中搜索这个问题,但是所有网站都返回了快速工作中的功能,但我需要这个案例。

我的自定义功能是:

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

如何使用args将我的args传递给其他系统函数?

谢谢你。

2 个答案:

答案 0 :(得分:19)

与(Objective-)C类似,您无法传递变量参数列表 直接到另一个功能。你必须创建一个CVaListPointer (Swift相当于C中的va_list)并调用一个函数 采用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 开始,可以将参数传递给

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

直接:

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

答案 1 :(得分:-1)

我相信您错误地使用了NSString.localizedStringWithFormat(self, args)。使用args调用另一个函数没有任何问题。

如果你看下面,你需要指定格式为NSString作为第一个参数: NSString.localizedStringWithFormat(format: NSString, args: CVarArgType...)

这个SO问题解释了如何在Swift中使用它:iOS Swift and localizedStringWithFormat