2016-11-01 61 views
1

此前在Objective-C,我將能夠做這樣的事情:如何自動複製原始文字?

NSInteger count = 100; 
NSString *text = [NSString stringWithFormat:@"count: %@", @(count)]; 

的Objective-C引進了自動裝箱原始文字的概念,所以我沒有處理%d%ld等。它會自動將原始文字轉換爲NSObject,格式化程序將解析爲%@

在迅速,有什麼類似的,我們可以做?

let count: Int = 100 
let text = String.init(format: "count of %@", count) 

上述崩潰因爲count不是指向對象的指針。

我知道我可以做內聯參數注入,如:

let text = "count of \(count)" 

但由於本地化的目的,本地化字符串格式需要更新的參數,它的代碼立即上面不能做之前發生。

+3

僅供參考 - 這不完全是Objective-C中的典型解決方案。大多數人會使用:'NSString * text = [NSString stringWithFormat:@「count:%ld」,(long)count];'。 – rmaddy

+2

'%@'格式說明符特別針對Objective-C對象。由於Swifts本地'Int'不是(不再)隱式橋接到Obj-C對象('NSNumber'),所以格式說明符不能應用於這種本地類型。你自己的解決方法工作的原因是'String'仍然被橋接到'NSString'。另一個解決方法是在用'%@'解析之前將'Int'實例轉換爲'NSNumber':'let text = String.init(format:「count of%@」,NSNumber(value:count))''。 – dfri

+0

那麼你的問題是你需要能夠動態更新計數? – PeejWeej

回答

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)") 
+1

小心使用字符串插值,因爲它可能返回與字符串初始化程序不同的結果(它返回對象的「描述」)。 – JAL

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" 

這真的是「自動裝箱」的確,它包裝在一個Objective-C NSNumber對象基本類型。

+0

是啊,我曾考慮將它包裝在一個'NSNumber'內,但是如果swift有一些語法自動爲我做了這個,那麼我很好奇。從別人的看法來看,似乎並不存在。 –

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)"。只要確保您將放入的值本地化,以便在與文本放在一起時很好地顯示。

相關問題