【问题标题】:Insert Charc into String in a Range where character X exist at Index - swift 2.0在索引处存在字符 X 的范围内将字符插入字符串中 - swift 2.0
【发布时间】:2016-02-25 14:24:08
【问题描述】:

请有人帮助我。

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

假设字符串有 20+ 个字符长,我想在 15 到 20 之间找到一个空格“”,然后在字符“”(空格)的索引之后插入一个新行(\n)是

我希望这是有道理的: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

提前感谢您的帮助

托马斯

【问题讨论】:

    标签: string swift swift2


    【解决方案1】:

    以下内容在15..&lt;END_OF_YOUR_STRING 范围内查找第一个空格,并将其替换为新行(\n)。在您的问题中,您表示您明确希望在15...20 范围内寻找一个空格,并且在空格之后插入一个新行。下面我假设你真的想要:

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

    这两种与您的问题的偏差都可以很容易地恢复,所以请告诉我您是否希望我按照您的指示具体到这一点(而不是包括我自己的原因),我会更新这个答案.

    解决方法如下:

    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:th 字符(后者在14...19 的范围内)。上面,我们从第 16 个字符(索引15)开始搜索第一个空格。

    【讨论】:

    • 谢谢 dfri 稍后我会试一试,并将答案标记为正确,一切顺利。这对我来说很有意义
    • @Tom 乐于助人!慢慢来。
    • 我仍然遇到致命错误:无法增加 endIndex.. 我认为它是因为它没有找到空间,因此我需要在某处添加一个 catch
    • @Tom 对于我上面的简单示例或超出此示例的实现?
    • 如果在给定柱数后没有找到空间,你将如何调整这个捕获错误
    【解决方案2】:

    感谢 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
            }
    
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-16
      • 2021-11-08
      • 2011-04-30
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      相关资源
      最近更新 更多