【问题标题】:Infinite loop when using while loop and replace string with Swift使用while循环并用Swift替换字符串时的无限循环
【发布时间】:2015-04-15 06:00:55
【问题描述】:

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

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

【问题讨论】:

    标签: string swift replace


    【解决方案1】:

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

    简化和修复代码:

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

    【讨论】:

    • 您的固定代码无效。我之前尝试过,但 xcode 要求我将 != nil 添加到我的代码中。这很奇怪,因为这个逻辑代码在 PHP 中确实有效,因为数据字符串变量一直在变化。
    • @TomSawyer 抱歉,我的代码中有错误。试试固定版本。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      如果需要,您可能需要 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/

      【讨论】:

      • 这会将“,,”留给“,,”。但话又说回来,我不确定 OP 的要求。
      • 您的代码将不起作用,因为它只替换了一次,,。你需要一个循环来匹配和替换所有匹配的字符串
      • 您的规范没有提到您的字符串可能包含两个以上的逗号。我编辑考虑到这一点。
      【解决方案4】:

      我不知道是不是因为你有一个 NSString 并且 replace 方法返回一个 String (也许它使 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 初始化程序返回的内容,但是如果您搜索 StackOverflow,则会出现有关 containsString 不在文档中并且直到 iOS8 才包含在内的警告(这似乎是confirmed here),即不是使用 iOS7。我没有对此进行深入研究,但如果您支持 iOS7,则值得探索。

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

      【讨论】:

        猜你喜欢
        • 2021-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-25
        • 2021-07-27
        • 1970-01-01
        • 1970-01-01
        • 2014-03-29
        相关资源
        最近更新 更多