如何自动提取原始文字?

时间:2016-11-01 18:44:40

标签: objective-c swift

以前在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)"

但是由于本地化的目的,在更新参数之前需要对字符串格式进行本地化,而上面的代码不能这样做。

3 个答案:

答案 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值进行本地化,以便在与文本放在一起时显示得很好。