以前在Objective-C中,我可以做类似的事情:
NSInteger count = 100;
NSString *text = [NSString stringWithFormat:@"count: %@", @(count)];
Objective-C引入了自动装箱原始文字的概念,因此我没有必要处理%d
,%ld
等。它会自动将原始文字转换为一个NSObject
,格式化程序将其解析为%@
。
在swift中,我们可以做类似的事情吗?
let count: Int = 100
let text = String.init(format: "count of %@", count)
上述崩溃是因为count
不是指向对象的指针。
我知道我可以进行内联参数注入,如:
let text = "count of \(count)"
但是由于本地化的目的,在更新参数之前需要对字符串格式进行本地化,而上面的代码不能这样做。
答案 0 :(得分:1)
使用基础类型并桥接到NSNumber
?
let count1: NSNumber = 100 // 100
let count2: NSNumber = 0.0 // 0
let count3: NSNumber = 2.73 // 2.73
let text = String(format: "count of %@ %@ %@", count1, count2, count3) // "count of 100 0 2.73"
这就是“autoboxing”的作用,它将一个原始类型包装在Objective-C NSNumber
对象中。
答案 1 :(得分:0)
没有完全回答这个问题,但我通过用String(…)
包装我的参数解决了这个问题,例如
let count: Int = 100
let text = String.init(format: "count of %@", String(count))
更新:与上述相同的实现:
let count: Int = 100
let text = String.init(format: "count of %@", "\(count)")
答案 2 :(得分:0)
以下是我通常如何做到这一点:我只是使用占位符进行本地化并在之后将其交换出来。所以我的字符串文件看起来像这样:
//English
"Could not read <name>" = "Could not read <name>."
//Spanish
"Could not read <name>" = "No puede leer <name>."
我的代码看起来像这样:
//assume you have a fileName variable
var localizedString = NSLocalizedString("Error reading <name>", comment: "Error message when an object could not be read.")
localizedString = localizedString.replacingOccurrences(of: "<name>" with: fileName)
与上面的示例中一样,您可以轻松地将占位符替换为fileName
之类的内容,而不是使用已经本地化的"\(count)"
。只需确保您对drop-in值进行本地化,以便在与文本放在一起时显示得很好。