变异字符串扩展会导致巨大的CPU影响

时间:2016-10-19 10:10:48

标签: swift string replace

我为String类创建了一个小扩展,以方便地从中删除字符。这是它的样子:

mutating func drop(characters chars: [String]) {
    for c in chars {
        self = self.replacingOccurrences(of: c, with: "")
    }
}

用法:

//string = ""Test"" (contains quotes), should be "Test" (w/ quotes)
string.drop(characters: ["\""])

现在,当我在一个字符串上调用此函数时,CPU会通过屋顶导致应用程序最终崩溃。

任何想法为什么?
谢谢!

更新

我意识到以下代码也会导致巨大的CPU影响,因此显然不是我的扩展程序的问题,而是其他问题:

string = string.replacingOccurrences(of: "\"", with: "")

更新#2 /解决方案

我发现了这个问题。我在while循环中执行所述语句,一旦superString内的字符串不再存在就结束了。为实现这一目标,我从string移除了replacingOccurrences superString。我意识到,在执行语句string之后显然不像superString中出现的那样。 简而言之:我必须在string删除superString之后执行语句,否则while循环将永远不会结束,从而导致CPU影响&崩溃。

感谢您尽力帮助!

2 个答案:

答案 0 :(得分:0)

建议避免多次改变字符串,这会导致性能下降,可能会像这样重写你的函数:

mutating func drop(charactersIn string: String) {
    self = String(
        self.characters.filter { !string.characters.contains($0) }
    )
}

// And then for example:
string.drop(charactersIn: "\"tT")

答案 1 :(得分:0)

解决方案

我在while loop执行上述声明,一旦string superStringstring不再存在,就会结束。
为实现这一目标,我从replacingOccurrences移除了superString string。我意识到,在执行语句superString之后,显然不像它superString中出现的那样。

长话短说:我必须在从while loop删除字符串后执行该语句,否则while superString.contains(pattern: myPattern) { var string = superString.searchFor(myPattern).get(0)! textfile = textfile.replacingOccurrences(of: string, with: "") string.drop(charactersInRegex: ["\""]) myArray.append(string) } 永远不会结束导致CPU影响的问题&崩溃。

目视:

while superString.contains(pattern: myPattern) {
    var string = superString.searchFor(myPattern).get(0)!
    string.drop(charactersInRegex: ["\""])
    myArray.append(string)

    textfile = textfile.replacingOccurrences(of: string, with: "")
}

而不是

.so