Swift 字符串格式参数绑定字典

Swift 字符串格式参数绑定字典,swift,nspredicate,nsexpression,Swift,Nspredicate,Nsexpression,是否有任何内置解决方案允许以NSExpressiondo的方式替换字符串(即提供绑定字典) 因此,不是: let s = String(format: "%@ %@", arguments: ["foo", "bar"]) // "foo bar" 我们有: let s = String(format: "$foo $bar", ["foo": "hello", "bar": "world"]) // hello world 另外,我知道发生了replaceAccurrencess,我需要使

是否有任何内置解决方案允许以
NSExpression
do的方式替换字符串(即提供绑定字典)

因此,不是:

let s = String(format: "%@ %@", arguments: ["foo", "bar"]) // "foo bar"
我们有:

let s = String(format: "$foo $bar", ["foo": "hello", "bar": "world"]) // hello world

另外,我知道发生了
replaceAccurrencess
,我需要使用NSExpression样式替换。谢谢

如matt所述,您需要实现自己的方法。您可以使用正则表达式来匹配字典中以美元符号开头的所有键的范围
“\\$\\w+”
,并使用此方法的
“ranges(of:)”
替换字符串的子范围,创建自定义初始值设定项扩展字符串:

extension String {
    init(format: String, _ dictionary: [String: String]) {
        var result = format
        for range in format.ranges(of: "\\$\\w+", options: .regularExpression).reversed() {
            result.replaceSubrange(range, with: dictionary[String(format[range].dropFirst())] ?? "")
        }
        self = result
    }
}

操场测试:

let result = String(format: "$foo $bar", ["foo": "hello", "bar": "world"])
print(result)   // "hello world"

没有什么内置的功能可以做到这一点,但是没有什么可以阻止您编写自己的方法来实现这种功能。显然,实现者可以决定什么是最好的,但是最好用比空字符串更明显的东西来替换缺少的键。可能是原始密钥,包括
$
符号。这将使调试更容易,因为它更引人注目。@rmaddy我也可以强制展开并使其崩溃。如果需要,他可以添加一个默认值
format[range]
to@LeoDabus那有多快?看起来很合法,但不适合UtableView,我想…再快不过了