You cannot pass a variable argument list to another function, you
have to pass a CVaListPointer
instead (the Swift equivalent
of va_list
in C):
public extension String {
var localized: String {
return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
}
func localized(args: CVarArg...) -> String {
return withVaList(args) {
NSString(format: self.localized, locale: Locale.current, arguments: $0) as String
}
}
}
Since NSString.localizedStringWithFormat
has no variant taking a
VAListPointer
, the equivalent NSString(format:, locale:, arguments:)
with the current locale is used.
Even simpler (attribution goes to @OOPer): Use
String.init(format:locale:arguments:)
which takes a
[CVarArg]
argument:
func localized(args: CVarArg...) -> String {
return String(format: self.localized, locale: Locale.current, arguments: args)
}
Now
"grant_gps_access".localized(args: "MyApp")
should work as expected, assuming that the strings file contains
the entry
"grant_gps_access" = "Please grant %@ GPS access";
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…