将Charc插入到索引中存在字符X的范围中的字符串 - swift 2.0

时间:2016-02-25 14:24:08

标签: string swift swift2

请有人帮助我。

我正在尝试将新行(\ n)添加到现有字符串中。

让我们说这个字符串是20多个字符长,我想找一个空格" "在15到20的范围之间然后插入一个新的行(\ n)就在索引之后的char" " (空格)

我希望这是有道理的:F

到目前为止我的代码如下

       var newString = string
        newString[newString.startIndex..< newString.startIndex.advancedBy(16)]

       /* let startIndex = newString.startIndex.advancedBy(16)
        let endIndex = newString.endIndex

        let newRange = startIndex ..< endIndex

        print("start index = \(newRange)")*/

        let range: Range<String.Index> = newString.rangeOfString(" ")!
        let index: Int = newString.startIndex.distanceTo(range.startIndex) 


        newString.insert("\n", atIndex: newString.startIndex.advancedBy(index))
        label.text = newString

如果我尝试以下

let newIndex = name.startIndex.advancedBy(19).distanceTo(range.endIndex)

我收到错误消息

  

致命错误:无法递增endIndex

我感觉我在正确的轨道上,但上面会在索引处插入一个新行,其中空格首先出现在字符串中,而不是在例如索引之间。 15和20

感谢您的提前帮助

托马斯

2 个答案:

答案 0 :(得分:1)

以下内容查找范围15..<END_OF_YOUR_STRING中的第一个空格,并将其替换为新行(\n)。在您提出的问题中,您声明明确要在范围15...20中查找空格,并在空格后插入新行。下面我假设你真的想要:

  1. 用新行替换空格,因为在换行符之后的行上会有一个尾随空格。
  2. 搜索从索引15开始的第一个空格,但一直持续到找到一个(否则:如果在范围15...20内找不到空格,则不应插入换行符?)。< / LI>

    这些与您的问题的偏差都可以很容易地恢复,所以请告诉我,如果您希望我按照您的指示专门指出(而不是包括我自己的理由),并且我&#39;我会更新这个答案。

    解决方案如下:

    var foo = "This is my somewhat long test string"
    let bar = 15 /* find first space " " starting from index 'bar' */
    if let replaceAtIndex = foo[foo.startIndex.advancedBy(bar)..<foo.endIndex]
        .rangeOfString(" ")?.startIndex.advancedBy(bar) {
    
        foo = foo.stringByReplacingCharactersInRange(
            replaceAtIndex...replaceAtIndex, withString: "\n")
    }
    
    print(foo)
    /* This is my somewhat
       long test string    */
    

    请注意,在范围15到20 中找到空格与 15:th到20:字符之间存在一个一个一个的区别(后者在14...19范围内。在上面,我们搜索从第16个字符开始的第一个空格(索引15)。

答案 1 :(得分:0)

感谢dfri指出我正确的方向。虽然他的答案对我的问题是正确的,但我提供了以下代码来帮助

if string.characters.count >= 20
    {

        let bar = 15 // where to split the code to begin looking for the character
        let beginString = string.substringWithRange(name.startIndex..<name.startIndex.advancedBy(bar))
        var endString = string[string.startIndex.advancedBy(bar)..<name.endIndex]

      if endString.containsString(" ")
      {
        let range = endString.rangeOfString(" ")

        if let i = range
        {
            endString.insert("\n", atIndex:i.startIndex.advancedBy(1) )
            let newString = "\(beginString)\(endString)"
            label.text = newString
        }

        }

    }