我有一个字符串:
var testString: String = "Hello %VARIABLE, I am %VARIABLE"
我需要实现一种用参数替换“%VARIABLE”的方法:
func methodReplace(_ inputString:String, _ of: String, _ with: [String]){
//how to do it
}
结果将是:
var result = methodReplace(testString, "%VARIABLE", ["John", "Marry"])
print(result)
//expected: "Hello John, I am Marry"
感谢您的帮助
更新:我自己解决了
func methodReplace(_ inputString:String, _ oldTemplate: String, _ newTemplates: [String]){
var result:String = inputString
for item in newTemplates {
var getRange = result.range(of: oldTemplate)
result = result.replacingCharaters(in: getRange!, with: item)
}
return result
}
答案 0 :(得分:1)
您自己的解决方案有两个问题。由于您强制展开该范围,因此如果数组中的替换项比原始字符串中的占位符多,它将崩溃。那样您就浪费了性能,因为每次都在字符串的开头开始寻找占位符。
更好的解决方案是从头到尾扫描字符串。如果找到占位符,则将其之前的所有内容放入结果字符串中,然后进行下一个替换。如果它是最后一个占位符,则停止并附加字符串的其余部分。
var result = ""
var iterator = with.makeIterator()
var searchRange = string.startIndex..<string.endIndex
while let placeholderRange = string.range(of: placeholder, options: [], range: searchRange, locale: nil) {
guard let replacement = iterator.next() else {
break
}
result.append(contentsOf: string[searchRange.lowerBound..<placeholderRange.lowerBound])
result.append(contentsOf: replacement)
searchRange = placeholderRange.upperBound..<searchRange.upperBound
}
result.append(contentsOf: string[searchRange])
return result