字符串格式参数绑定字典
String format parameters binding dictionary
是否有任何内置解决方案允许以 NSExpression
的方式替换字符串(即提供绑定字典)?
所以代替:
let s = String(format: "%@ %@", arguments: ["foo", "bar"]) // "foo bar"
我们有:
let s = String(format: "$foo $bar", ["foo": "hello", "bar": "world"]) // hello world
P.S。我知道 replaceOccurrences
,我需要 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"
是否有任何内置解决方案允许以 NSExpression
的方式替换字符串(即提供绑定字典)?
所以代替:
let s = String(format: "%@ %@", arguments: ["foo", "bar"]) // "foo bar"
我们有:
let s = String(format: "$foo $bar", ["foo": "hello", "bar": "world"]) // hello world
P.S。我知道 replaceOccurrences
,我需要 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"