使用 while 循环时无限循环并将​​字符串替换为 Swift

Infinite loop when using while loop and replace string with Swift

我需要编写一个脚本来替换字符串直到没有匹配项。 但是它没有用。 这是我的脚本:

var datastring = NSString(data: data, encoding: NSUTF8StringEncoding)
while((datastring?.containsString(",,")) != nil)
{
   datastring = datastring!.stringByReplacingOccurrencesOfString(",,", withString: ",")
}

字符串是否包含“,”→否(即false)。假与零不同。这就是你陷入无限循环的原因。

如果需要,您可能需要进行 if 测试。或者,您可以直接使用 stringByReplacingOccurrencesOfString 方法。

var str = "Hello,, playground,, this is a test string."
str = str.stringByReplacingOccurrencesOfString(",,", withString: ",")
println(str) // Hello, playground, this is a test string.

它将替换所有出现的s

循环编辑:

var str : NSString = "Hello,,, playground,,,,,, this is ,,,,a test string."

while (str.containsString(",,") == true) {
    str = str.stringByReplacingOccurrencesOfString(",,", withString: ",")
} // 3 times

println(str) // Hello, playground, this is a test string.

演示:http://swiftstub.com/22979236/

您当前的代码只需检查 containsString returns 值或 nil。基本上它与检查 datastring 是否为 nil 相同。每当它不是 nil 时,无限循环就会开始。

简化和固定代码:

while datastring?.containsString(",,") == true {
    datastring = datastring?.stringByReplacingOccurrencesOfString(",,", withString: ",")
}

如果你想同时检查两者,请使用:

while  (datastring != nul) && (datastring.containsString(",,")) {
    datastring = datastring.stringByReplacingOccurrencesOfString(",,", withString: ",")
}

它将首先检查它是否不为 nil,然后检查它是否包含选定的字符串(在本例中,该字符串为“,”)。我相信如果你的对象是 nil 并且你首先检查它是否包含一些字符串,它会使你的应用程序崩溃。

我不知道是不是因为你有一个 NSString 和替换方法 returns 一个字符串(也许它让 String 和 NSString 之间的桥接有点混乱?),但你可以让这个工作通过以下方式:

let datastring = "Hello,, Hello,,,"
let data = datastring.dataUsingEncoding(NSUTF8StringEncoding)
var str = NSString(data: data!, encoding: NSUTF8StringEncoding) as! String
while str.rangeOfString(",,") != nil
{
    str = str.stringByReplacingOccurrencesOfString(",,", withString: ",")
}
str // Hello, Hello,

这确保我们牢牢地处于 String 领域并且只使用 String 方法而不是 NSString 方法。

如果您想继续使用 NSString,以下内容也适用:

let datastring = "Hello,,,,,, Hello,,,,,,,"
let data = datastring.dataUsingEncoding(NSUTF8StringEncoding)
var str:NSString = NSString(data: data!, encoding: NSUTF8StringEncoding)!
while str.containsString(",,") {
    str = str.stringByReplacingOccurrencesOfString(",,", withString: ",")
}
str // "Hello, Hello,"

这意味着您完全远离可选值,这就是 NSString 初始值设定项 returns 但是如果您搜索 Whosebug,会出现关于 containsString 不在文档中并且直到 iOS8 才被包含的警告(看起来 confirmed here),即不使用 iOS7。我没有对此进行更深入的研究,但如果您支持 iOS7.

,那么值得探索一下

注意:为简洁起见,我只使用强制转换为字符串(以及强制解包数据),IRL 你会测试这些以确保两者都没有返回 nil。