format包含字符串数组的字符串

时间:2016-07-21 17:32:01

标签: ios arrays swift

我正在尝试使用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

我看过thisthis以及this个问题(还有更多),但我仍然不知道如何完成我想要做的事情。

4 个答案:

答案 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"])