【问题标题】:Convert Swift string to array将 Swift 字符串转换为数组
【发布时间】:2014-11-13 07:09:08
【问题描述】:

如何在 Swift 中将字符串 "Hello" 转换为数组 ["H","e","l","l","o"]

在 Objective-C 中我使用了这个:

NSMutableArray *characters = [[NSMutableArray alloc] initWithCapacity:[myString length]];
for (int i=0; i < [myString length]; i++) {
    NSString *ichar  = [NSString stringWithFormat:@"%c", [myString characterAtIndex:i]];
    [characters addObject:ichar];
}

【问题讨论】:

    标签: ios arrays swift string


    【解决方案1】:
    let str = "cdcd"
    let characterArr = str.reduce(into: [Character]()) { result, letter in
        result.append(letter)
    }
    print(characterArr)
    //["c", "d", "c", "d"]
    

    【讨论】:

      【解决方案2】:

      对于 Swift 5.3 版,它很简单:

      let string = "Hello world"
      let characters = Array(string)
      
      print(characters)
      

      // [“H”、“e”、“l”、“l”、“o”、“”、“w”、“o”、“r”、“l”、“d” "]

      【讨论】:

        【解决方案3】:

        假设您有四个文本字段“otpOneTxt”、“otpTwoTxt”、“otpThreeTxt”、“otpFourTxt”和一个字符串“getOtp”

                    let getup = "5642"
                    let array = self.getOtp.map({ String($0) })
                    
                    otpOneTxt.text = array[0] //5
                   
                    otpTwoTxt.text = array[1] //6
                   
                    otpThreeTxt.text = array[2] //4
                    
                    otpFourTxt.text = array[3] //2
        

        【讨论】:

          【解决方案4】:

          一个简单的方法是map 变量并将每个Character 作为String 返回:

          let someText = "hello"
          
          let array = someText.map({ String($0) }) // [String]
          

          输出应该是["h", "e", "l", "l", "o"]

          【讨论】:

            【解决方案5】:

            对于String上的函数:components(separatedBy: String)

            在 Swift 5.1 中

            更改为:

            string.split(separator: "/")

            【讨论】:

            • 为我工作.....
            【解决方案6】:

            编辑 (Swift 4)

            在 Swift 4 中,您不必使用 characters 来使用 map()。只需在字符串上执行map()

            let letters = "ABC".map { String($0) }
            print(letters) // ["A", "B", "C"]
            print(type(of: letters)) // Array<String>
            

            或者,如果您希望更短:"ABC".map(String.init)(2 字节?)

            编辑(Swift 2 和 Swift 3)

            在 Swift 2 和 Swift 3 中,您可以对 characters 属性使用 map() 函数。

            let letters = "ABC".characters.map { String($0) }
            print(letters) // ["A", "B", "C"]
            

            原创(Swift 1.x)

            接受的答案似乎不是最好的,因为序列转换的String 不是String 序列,而是Character

            $ swift
            Welcome to Swift!  Type :help for assistance.
              1> Array("ABC")
            $R0: [Character] = 3 values {
              [0] = "A"
              [1] = "B"
              [2] = "C"
            }
            

            以下内容对我有用:

            let str = "ABC"
            let arr = map(str) { s -> String in String(s) }
            

            全局函数 map() 的参考在这里:http://swifter.natecook.com/func/map/

            【讨论】:

            • 略短:arr = map(str) { String($0) }
            • 使用 Array 初始化器代替:Array("ABC".characters)
            • @chrisamanse,"ABC".charactersArray("ABC".characters) 之间没有区别。
            • 在 Swift 3 中有所不同。"ABC".characters 返回一个类型 String.CharacterView。要将其转换为数组,特别是 [Character] 类型,您必须在其上使用 Array 初始化程序。
            • @chrisamanse 哦,我不知道。我错了。感谢您指出。顺便说一句,我打算 [String] 而不是 [Character] 因为 op 想要一个字符串数组:)
            【解决方案7】:

            在 Swift 4 中,由于StringCharacter 的集合,所以需要使用map

            let array1 = Array("hello") // Array<Character>
            let array2 = Array("hello").map({ "\($0)" }) // Array<String>
            let array3 = "hello".map(String.init) // Array<String>
            

            【讨论】:

              【解决方案8】:

              为 Swift 4 更新

              这里有 3 种方法。

              //array of Characters
              let charArr1 = [Character](myString)
              
              //array of String.element
              let charArr2 = Array(myString)
              
              for char in myString {
                //char is of type Character
              }
              

              在某些情况下,人们真正想要的是一种将字符串转换为每个长度为 1 个字符的小字符串数组的方法。这是一种非常有效的方法:

              //array of String
              var strArr = myString.map { String($0)}
              

              斯威夫特 3

              这里有 3 种方法。

              let charArr1 = [Character](myString.characters)
              let charArr2 = Array(myString.characters)
              for char in myString.characters {
                //char is of type Character
              }
              

              在某些情况下,人们真正想要的是一种将字符串转换为每个长度为 1 个字符的小字符串数组的方法。这是一种非常有效的方法:

              var strArr = myString.characters.map { String($0)}
              

              或者您可以为字符串添加扩展名。

              extension String {
                 func letterize() -> [Character] {
                   return Array(self.characters)
                }
              }
              

              那么你可以这样称呼它:

              let charArr = "Cat".letterize()
              

              【讨论】:

                【解决方案9】:

                在 Swift 中更简单:

                let string : String = "Hello ?? ??"
                let characters = Array(string)
                println(characters)
                // [H, e, l, l, o,  , ?, ?,  , ??]
                

                这使用了以下事实

                • Array 可以从 SequenceType 创建,并且
                • String 符合SequenceType 协议,及其序列生成器 枚举字符。

                而且由于 Swift 字符串完全支持 Unicode,所以即使是字符也可以使用 在“基本多语言平面”之外(例如?)并带有扩展字形 簇(例如??,实际上是由两个 Unicode标量组成)。


                更新:从 Swift 2 开始, String 不再符合 SequenceType,但 characters 属性提供了一个序列 Unicode 字符:

                let string = "Hello ?? ??"
                let characters = Array(string.characters)
                print(characters)
                

                这也适用于 Swift 3


                更新:从 Swift 4 开始, String (再次)是它的集合 Characters:

                let string = "Hello ?? ??"
                let characters = Array(string)
                print(characters)
                // ["H", "e", "l", "l", "o", " ", "?", "?", " ", "??"]
                

                【讨论】:

                • 您知道为什么尝试加入 (let joined = ", ".join(characters);) 数组会导致 'String' is not identical to 'Character' 错误吗?
                • @Mohamad:枚举一个字符串会产生一个字符序列,但", ".join(...) 需要一个字符串数组。下面 devxoul 的回答显示了如何拆分为字符串数组。
                • @Fonix: characters 是字符串字符的集合和视图。从字符创建一个数组会生成一个副本。 – 当然可以直接访问字符:for i in string.characters.indices { print(string.characters[i]) } 或只是for c in string.characters { print(c) }
                • @Fonix: ...另一方面,对字符串的随机索引可能很慢,一次创建一个包含所有字符的数组可能是有利的。示例:stackoverflow.com/questions/40371929/….
                • @DaniSpringer:Swift 4 目前处于测试阶段,您需要 Xcode 9 测试版:developer.apple.com/swift/resources
                【解决方案10】:

                String上也有这个有用的功能:components(separatedBy:String)

                let string = "1;2;3"
                let array = string.components(separatedBy: ";")
                print(array) // returns ["1", "2", "3"]
                

                可以很好地处理由“;”之类的字符分隔的字符串甚至是“\n”

                【讨论】:

                  【解决方案11】:
                  func letterize() -> [Character] {
                      return Array(self.characters)
                  }
                  

                  【讨论】:

                  • 您能否提供更多信息,为什么这会起作用? :)
                  • @pix 我认为他的意思是这是一个在字符串扩展中定义的函数。我会将其添加到我的答案中。
                  【解决方案12】:
                      let string = "hell0"
                      let ar = Array(string.characters)
                      print(ar)
                  

                  【讨论】:

                  【解决方案13】:

                  你也可以创建一个扩展:

                  var strArray = "Hello, playground".Letterize()
                  
                  extension String {
                      func Letterize() -> [String] {
                          return map(self) { String($0) }
                      }
                  }
                  

                  【讨论】:

                    【解决方案14】:

                    Martin R 的答案是最好的方法,正如他所说,由于 String 符合 SquenceType 协议,您还可以枚举一个字符串,在每次迭代时获取每个字符。

                    let characters = "Hello"
                    var charactersArray: [Character] = []
                    
                    for (index, character) in enumerate(characters) {
                        //do something with the character at index
                        charactersArray.append(character)
                    }
                    
                    println(charactersArray)
                    

                    【讨论】:

                    • 或者只是for character in characters { charactersArray.append(character)}没有enumeration()
                    猜你喜欢
                    • 1970-01-01
                    • 2016-11-20
                    • 2015-10-11
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-06-07
                    • 2016-01-27
                    • 1970-01-01
                    相关资源
                    最近更新 更多