使用 while 循环时的无限循环,并用 Swift 替换字符串



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

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

您当前的代码只需检查containsString返回值还是返回nil。基本上与检查datastring是否nil相同。只要它不nil,无限循环就会启动。

简化和修复代码:

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

如果要检查两者,请使用以下命令:

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

它将首先检查它是否不是 nil,然后检查它是否包含选定的字符串(在这种情况下,该字符串是",,")。我相信如果你的对象是 nil 并且你首先检查它是否包含一些字符串,它会崩溃你的应用程序。

字符串是否包含 ","→ no(即 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/

我不知道

是不是因为您有一个 NSString 并且替换方法返回一个字符串(也许它会让字符串和 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,

这确保了我们坚定地处于字符串的领域,并且只使用字符串方法而不是 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初始化器返回的内容,但如果你搜索StackOverflow,就会有关于containsString不在文档中的警告,直到iOS8才被包含(这似乎在这里得到证实),即不适用于iOS7。我没有深入研究这个问题,但如果你支持 iOS7,这是值得探索的。

注意:为了简洁起见,我只对 String 使用了强制转换(以及数据的强制解包),您将测试这些以确保两者都不返回 nil。

最新更新