使用 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.
您当前的代码只需检查 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。
我需要编写一个脚本来替换字符串直到没有匹配项。 但是它没有用。 这是我的脚本:
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.
您当前的代码只需检查 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。