2016-12-01 19 views
4

我有擴展字符串斯威夫特:煩惱與字符串格式化

func localized(table: String? = nil, bundle: Bundle = .main, args: CVarArg...) -> String { 
    return String(
    format: NSLocalizedString(
     self, 
     tableName: table, 
     bundle: bundle, 
     value: self, 
     comment: "" 
    ), 
    args 
) 
} 

Localizable.strings文件:

"%d seconds ago" = "%d seconds ago"; 

用法:

print("%d seconds ago".localized(args: 5)) 
print(String.localizedStringWithFormat("%d seconds ago", 5)) 

而且結果:

<some_random_number_here> seconds ago. 
5 seconds ago. 

有人可以解釋我做錯了什麼?

回答

5

String具有兩個相似的初始化:

init(format: String, _ arguments: CVarArg...) 
init(format: String, arguments: [CVarArg]) 

第一個就是,可變數量的參數,第二個 的所有參數的數組:

print(String(format: "x=%d, y=%d", 1, 2)) 
print(String(format: "x=%d, y=%d", arguments: [1, 2])) 

在你localized方法,args: CVarArg...可變參數 並且那些在功能體內作爲陣列 的撥款類型,在這種情況下[CVarArg]。 因此,必須傳遞給String(format: arguments:)

func localized(table: String? = nil, bundle: Bundle = .main, args: CVarArg...) -> String { 
    return String(
    format: NSLocalizedString(
     self, 
     tableName: table, 
     bundle: bundle, 
     value: self, 
     comment: "" 
    ), 
    arguments: args // <--- HERE 
) 
} 

參見「可變參數的參數」中的 斯威夫特參考的"Functions"章。

0

試試吧。 args返回一個數組。

extension String { 
    func localized(table: String? = nil, bundle: Bundle = .main, args: CVarArg...) -> String { 
     return String(format: NSLocalizedString(self, tableName: table, bundle: bundle, value: self, comment: ""), args.first!) 
    } 
} 

print("%d hey!".localized(args: 5)) 

如果要設置多個參數,你需要調用此方法

(format: String, arguments: [CVarArg]) 

但你應該添加更多的佔位符

print("%d %d hey!".localized(args: 5, 7))