如何用多个参数替换多个StringProtocol

时间:2018-12-02 10:00:15

标签: swift

我有一个字符串:

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
}

1 个答案:

答案 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