我正在尝试使用String
的数组创建String
,我希望这可行:
let format = "%@ and %@!"
let str1 = "bla"
let str2 = "blob"
private func formatItNicely(format: String, substrings: [String]) -> String {
return String(format: format, arguments: substrings)
}
let result = formatItNicely(format, substrings: [str1, str2])
但我得到fatal error: can't unsafeBitCast between types of different sizes
。
答案 0 :(得分:5)
String(format:, arguments: )
期望[CVarArgType]
为第二个
参数:
let format = "%@ and %@!"
let str1 = "bla"
let str2 = "blob"
private func formatItNicely(format: String, substrings: [CVarArgType]) -> String {
return String(format: format, arguments: substrings)
}
let result = formatItNicely(format, substrings: [str1, str2])
print(result) // bla and blob!
但请注意,如果格式说明符不匹配,这可能会崩溃(或产生意外的输出) 实际的参数,格式化函数不能(不能)检查。
答案 1 :(得分:1)
或者您可以使用可变参数:
private func formatItNicely(format: String, _ arguments: CVarArgType...) -> String {
return String(format: format, arguments: arguments)
}
这样称呼它:
let format = "%@ and %@!"
let str1 = "bla"
let str2 = "blob"
let result = formatItNicely(format, str1, str2)
答案 2 :(得分:1)
由于你没有做任何非常有趣的事情,你实际上并不需要内置的格式字符串逻辑。你可以自己做替换:
func join(_ arr : [String], withFormatString s: String) -> String {
var s = s
for str in arr {
if let r = s.range(of: "%@") {
s.replaceSubrange(r, with: str)
}
}
return s
}
let result = join([str1,str2], withFormatString:format)
答案 3 :(得分:1)
(现在)您无需执行上述建议的任何操作。
在 Swift5 中,您只需将 Strings
数组作为 arguments
传递给 String.init(format:arguments:)
。
因此,以下对我来说工作正常,无需任何类型转换/映射等
let formatString = "First one: %1$@, second one: %2$@"
label.text = String(format: formatString, arguments: ["hello", "blabla"])