Pierre Pierre - 24 days ago 6
Swift Question

localizeWithFormat and variadic arguments in Swift

I am trying to create a String extension to do something like that

"My name is %@. I am %d years old".localizeWithFormat("John", 30)


which looks like this

extension String {
func localizeWithFormat(arguments: CVarArgType...) -> String {
return String.localizedStringWithFormat(
NSLocalizedString(self,
comment: ""), getVaList(arguments))
}
}


it give me the following compilation error


Type CVaListPointer does not conform to protocol CVargType


Anyone knows how to work aroundthis compilation error?

Answer

This should be pretty simple just change your parameters as follow:

extension String {
    func localizeWithFormat(name:String,age:Int, comment:String = "") -> String {
        return String.localizedStringWithFormat( NSLocalizedString(self, comment: comment), name, age)
    }
}

"My name is %@. I am %d years old".localizeWithFormat("John", age: 30)  // "My name is John. I am 30 years old"

init(format:locale:arguments:)

extension String {
    func localizeWithFormat(args: CVarArgType...) -> String {
        return String(format: self, locale: nil, arguments: args)
    }
    func localizeWithFormat(local:NSLocale?, args: CVarArgType...) -> String {
        return String(format: self, locale: local, arguments: args)
    }
}
let myTest1 = "My name is %@. I am %d years old".localizeWithFormat(NSLocale.currentLocale(), args: "John",30)
let myTest2 = "My name is %@. I am %d years old".localizeWithFormat("John",30)