【问题标题】:How can I capitalize all the strings inside an array directly?如何直接将数组中的所有字符串大写?
【发布时间】:2015-04-25 17:52:57
【问题描述】:

我学得很快。我一直在操场上尝试这个。我不知道为什么这里的字符串没有大写。或者有没有其他方法可以直接将数组内的字符串大写?

这是我的代码。

var dogNames = ["Sean", "fido", "Sarah", "Parker", "Walt", "abby", "Yang"]

for index in 0..<dogNames.count {
    var dogName = dogNames[index].capitalizedString
    dogNames.removeAtIndex(index)
    dogNames.append(dogName)
}

当我尝试再次显示变量 dogNames 时。里面的字符串没有大写。

【问题讨论】:

  • 您可以在 for 循环中直接替换 dogNames[index] = somethingelse

标签: ios string swift capitalize


【解决方案1】:

这是 swift 3.0 中最简单的方法:

var dogNames = ["Sean", "fido", "Sarah", "Parker", "Walt", "abby", "Yang"]

dogNames = dogNames.map {$0.capitalized}
print("dogNames: \(dogNames)")

【讨论】:

    【解决方案2】:

    更新:Xcode 8.2.1 • Swift 3.0.2

    var dogNames = ["Sean", "fido", "Sarah", "Parker", "Walt", "abby", "Yang"]
    
    for (index, element) in dogNames.enumerated() {
        dogNames[index] = element.capitalized
    }
    
    print(dogNames)   // "["Sean", "Fido", "Sarah", "Parker", "Walt", "Abby", "Yang"]\n"
    

    这是使用map()的典型案例:

    let dogNames1 = ["Sean", "fido", "Sarah", "Parker", "Walt", "abby", "Yang"].map{$0.capitalized}
    

    filter() 示例:

    let dogNamesStartingWithS = ["Sean", "fido", "Sarah", "Parker", "Walt", "abby", "Yang"].filter{$0.hasPrefix("S")}
    
    dogNamesStartingWithS   // ["Sean", "Sarah"]
    

    您可以将两者结合起来:

    let namesStartingWithS = ["sean", "fido", "sarah", "parker", "walt", "abby", "yang"].map{$0.capitalized}.filter{$0.hasPrefix("S")}
    
    namesStartingWithS   // ["Sean", "Sarah"]
    

    如果需要,您还可以使用方法 sort(或 sorted,如果您不想改变原始数组)按字母顺序对结果进行排序:

    let sortedNames = ["sean", "fido", "sarah", "parker", "walt", "abby", "yang"].map{$0.capitalized}.sorted()
    
    sortedNames  // ["Abby", "Fido", "Parker", "Sarah", "Sean", "Walt", "Yang"]
    

    【讨论】:

    • 嗯,很酷。还没有听说过/学习地图功能。谢谢!
    • 很容易想象 $0 是数组的每一项
    • @LeonardoSavioDabus 你能解释一下地图或建议一些链接吗?非常感谢你:)
    • map 将循环遍历整个数组,将闭包方法应用于所有项目。 $0 是该特定索引处的项目。 $0.capitalizedString 从第一个元素到最后一个元素与 yourArray[index].capitalizedString 相同
    • 过滤器是相同的,但只有满足闭包中指定的比较时才会保留元素
    【解决方案3】:

    使用.uppercaseString 将所有字符大写。

    【讨论】:

      【解决方案4】:

      也回答我自己的问题。总结我在此处的答案中找到的所有内容。我想出了这个解决方案。这就是我用更少的过程来解决这个问题的方法。

      var dogNames = ["Sean", "fido", "Sarah", "Parker", "Walt", "abby", "Yang"]
      
      
      for index in 0..<dogNames.count {
      
          if dogNames[index] != dogNames[index].capitalizedString {
              var dogName = dogNames[index].capitalizedString
              dogNames[index] = dogName
          }
      
      }
      

      【讨论】:

      • 很高兴你能弄明白。
      【解决方案5】:

      通过从数组中间删除然后追加到末尾,您最终会跳过一些项目。以下是数组在每一步中的样子:

      [Sean, fido, Sarah, Parker, Walt, abby, Yang]
      [fido, Sarah, Parker, Walt, abby, Yang, Sean] (index=0; Sean moved to end)
      [fido, Parker, Walt, abby, Yang, Sean, Sarah] (index=1; Sarah moved to end)
      [fido, Parker, abby, Yang, Sean, Sarah, Walt] (index=2; Walt moved to end)
      [fido, Parker, abby, Sean, Sarah, Walt, Yang]
      [fido, Parker, abby, Sean, Walt, Yang, Sarah]
      [fido, Parker, abby, Sean, Walt, Sarah, Yang]
      [fido, Parker, abby, Sean, Walt, Sarah, Yang]
      

      如果你想保持数组完整,在你取它的同一个索引处替换会更有意义:

      dogNames[index] = dogName
      

      但是你可以通过使用 Array.map 独立处理每个项目来更优雅地做到这一点,而根本不必处理索引:

          let dogNames = ["Sean", "fido", "Sarah", "Parker", "Walt", "abby", "Yang"]
          let capitalDogNames = dogNames.map({ (dogName) -> String in
              return dogName.capitalizedString
          })
      

      【讨论】:

      • 哦,我明白了。我知道了!我好跛脚。我应该怎么做?我只想将每个字符串大写。
      • 是的。 map 函数接受一个闭包并将其应用于数组中的每个项目,并为您提供一个结果数组。它接受什么类型的闭包有点挑剔。您必须为每个项目指定返回值:在本例中为 String
      【解决方案6】:

      你必须以相反的顺序执行循环:

      for index in reverse(0..<dogNames.count)
      

      原因是当你从数组中删除一个元素时,删除后的所有元素都会向后移动一个位置,因此它们的索引会更改 - 而之前的所有元素都没有任何索引更改。通过以相反的顺序导航,您可以确定仍要处理的项目的索引没有更改。

      【讨论】:

        【解决方案7】:

        尝试使用以下代码:

        var dogNames = ["Sean", "fido", "Sarah", "Parker", "Walt", "abby", "Yang"]
        
        for index in 0..<dogNames.count {
            var dogName = dogNames[index].capitalizedString
            dogNames[index]=dogName
        }
        

        输出:

        [肖恩、菲多、莎拉、帕克、沃尔特、艾比、杨]

        【讨论】:

        • 是的,它奏效了。我很蹩脚,因为删除了一个项目,我没有看到,有些项目被跳过了。无论如何,还有一种方法可以检查字符串是否已经大写,以便可以减少这个过程?
        • 你必须通过NSCharacterSet.uppercaseLetterCharacterSet()检查字符
        猜你喜欢
        • 2016-04-10
        • 2019-02-28
        • 2017-11-27
        • 2017-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多