【问题标题】:How do I convert a Swift Array to a String?如何将 Swift 数组转换为字符串?
【发布时间】:2014-11-07 17:44:36
【问题描述】:

我知道如何以编程方式做到这一点,但我确信有一种内置方式......

我使用的每种语言都有一些对象集合的默认文本表示形式,当您尝试将数组与字符串连接或将其传递给 print() 函数等时,它会吐出这些对象集合。 Apple 的 Swift 语言有一个内置的方法可以轻松地将 Array 转换为 String,或者我们在对数组进行字符串化时总是必须明确?

【问题讨论】:

  • Swift 4: array.description 或者如果你想要自定义分隔符 array.joined(separator: ",")

标签: ios arrays swift


【解决方案1】:

如果数组中包含字符串,可以使用Stringjoin方法:

var array = ["1", "2", "3"]

let stringRepresentation = "-".join(array) // "1-2-3"

Swift 2 中:

var array = ["1", "2", "3"]

let stringRepresentation = array.joinWithSeparator("-") // "1-2-3"

如果您想使用特定的分隔符(连字符、空格、逗号等),这会很有用。

否则,您可以简单地使用 description 属性,它返回数组的字符串表示形式:

let stringRepresentation = [1, 2, 3].description // "[1, 2, 3]"

提示:任何实现Printable 协议的对象都有一个description 属性。如果您在自己的类/结构中采用该协议,您也可以使它们打印友好

Swift 3

  • join 变为 joined,例如 [nil, "1", "2"].flatMap({$0}).joined()
  • joinWithSeparator 变为 joined(separator:)(仅适用于字符串数组)

Swift 4

var array = ["1", "2", "3"]
array.joined(separator:"-")

【讨论】:

  • @Andrej:它适用于 1.2 和 2.0。你使用的是字符串数组吗?
  • 安东尼奥,对不起,我的错。我的阵列有问题。现在我可以确认您的解决方案有效。 :)
  • "-".join(array) 在 Swift 2、Xcode 7 Beta 6 中不再可用,请尝试使用 array.joinWithSeparator("-")
  • joinWithSeparator 仅适用于字符串数组。如果您有其他对象数组,请先使用map。例如,[1, 2, 3].map({"\($0)"}).joinWithSeparator(",")
  • @Dmitry 不要单独使用字符串插值来转换为字符串。在 String 上使用初始化器会更好
【解决方案2】:

与您所描述的 Swift 等价的是字符串插值。如果你正在考虑像 JavaScript 做 "x" + array 这样的事情,那么 Swift 中的等价物是 "x\(array)"

作为一般说明,字符串插值与Printable 协议之间存在重要区别。只有某些类符合PrintableEvery 类可以以某种方式进行字符串插值。这在编写泛型函数时很有帮助。您不必将自己局限于Printable 类。

【讨论】:

    【解决方案3】:

    Swift 2.0 Xcode 7.0 beta 6 及以上版本使用joinWithSeparator() 而不是join()

    var array = ["1", "2", "3"]
    let stringRepresentation = array.joinWithSeparator("-") // "1-2-3"
    

    joinWithSeparator 被定义为SequenceType 的扩展

    extension SequenceType where Generator.Element == String {
        /// Interpose the `separator` between elements of `self`, then concatenate
        /// the result.  For example:
        ///
        ///     ["foo", "bar", "baz"].joinWithSeparator("-|-") // "foo-|-bar-|-baz"
        @warn_unused_result
        public func joinWithSeparator(separator: String) -> String
    }
    

    【讨论】:

      【解决方案4】:

      我的作品在 NSMutableArray 上使用 componentsJoinedByString

      var array = ["1", "2", "3"]
      let stringRepresentation = array.componentsJoinedByString("-") // "1-2-3"
      

      【讨论】:

        【解决方案5】:

        使用 Swift 5,根据您的需要,您可以选择以下 Playground 示例代码之一来解决您的问题。


        Characters 的数组转换为不带分隔符的String

        let characterArray: [Character] = ["J", "o", "h", "n"]
        let string = String(characterArray)
        
        print(string)
        // prints "John"
        

        Strings 的数组转换为不带分隔符的String

        let stringArray = ["Bob", "Dan", "Bryan"]
        let string = stringArray.joined(separator: "")
        
        print(string) // prints: "BobDanBryan"
        

        Strings 的数组转换为String,单词之间有分隔符:

        let stringArray = ["Bob", "Dan", "Bryan"]
        let string = stringArray.joined(separator: " ")
        
        print(string) // prints: "Bob Dan Bryan"
        

        Strings 的数组转换为String,字符之间有分隔符:

        let stringArray = ["car", "bike", "boat"]
        let characterArray = stringArray.flatMap { $0 }
        let stringArray2 = characterArray.map { String($0) }
        let string = stringArray2.joined(separator: ", ")
        
        print(string) // prints: "c, a, r, b, i, k, e, b, o, a, t"
        

        Floats 的数组转换为String,数字之间有分隔符:

        let floatArray = [12, 14.6, 35]
        let stringArray = floatArray.map { String($0) }
        let string = stringArray.joined(separator: "-")
        
        print(string)
        // prints "12.0-14.6-35.0"
        

        【讨论】:

        • 我有一个字符串,看起来像:“[1,2,3]”。有什么方法可以轻松地将其转换为数组 [Int]?很容易,即与 .description 的作用相反?
        • @user2363025 uni 可以使用 JSON 解码器。 try JSONDecoder().decode([Int].self, from: Data(string.utf8))
        【解决方案6】:
        let arrayTemp :[String] = ["Mani","Singh","iOS Developer"]
            let stringAfterCombining = arrayTemp.componentsJoinedByString(" ")
           print("Result will be >>>  \(stringAfterCombining)")
        

        结果将是 >>> Mani Singh iOS 开发人员

        【讨论】:

          【解决方案7】:

          您可以使用打印功能打印任何对象

          或使用\(name) 将任何对象转换为字符串。

          例子:

          let array = [1,2,3,4]
          
          print(array) // prints "[1,2,3,4]"
          
          let string = "\(array)" // string == "[1,2,3,4]"
          print(string) // prints "[1,2,3,4]"
          

          【讨论】:

            【解决方案8】:

            在 Swift 2.2 中,您可能必须将数组转换为 NSArray 才能使用 componentsJoinedByString(",")

            let stringWithCommas = (yourArray as NSArray).componentsJoinedByString(",")
            

            【讨论】:

            • 顺便说一下,这只是objective-c在swift中的翻译。
            【解决方案9】:

            斯威夫特 3

            ["I Love","Swift"].joined(separator:" ") // previously joinWithSeparator(" ")
            

            【讨论】:

            • 我会说它是 ["I Love","Swift"].joined(separator: " ")
            【解决方案10】:

            对于 SWIFT 3:

            func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
                if textField == phoneField
                {
                    let newString = NSString(string: textField.text!).replacingCharacters(in: range, with: string)
                    let components = newString.components(separatedBy: NSCharacterSet.decimalDigits.inverted)
            
                    let decimalString = NSString(string: components.joined(separator: ""))
                    let length = decimalString.length
                    let hasLeadingOne = length > 0 && decimalString.character(at: 0) == (1 as unichar)
            
                    if length == 0 || (length > 10 && !hasLeadingOne) || length > 11
                    {
                        let newLength = NSString(string: textField.text!).length + (string as NSString).length - range.length as Int
            
                        return (newLength > 10) ? false : true
                    }
                    var index = 0 as Int
                    let formattedString = NSMutableString()
            
                    if hasLeadingOne
                    {
                        formattedString.append("1 ")
                        index += 1
                    }
                    if (length - index) > 3
                    {
                        let areaCode = decimalString.substring(with: NSMakeRange(index, 3))
                        formattedString.appendFormat("(%@)", areaCode)
                        index += 3
                    }
                    if length - index > 3
                    {
                        let prefix = decimalString.substring(with: NSMakeRange(index, 3))
                        formattedString.appendFormat("%@-", prefix)
                        index += 3
                    }
            
                    let remainder = decimalString.substring(from: index)
                    formattedString.append(remainder)
                    textField.text = formattedString as String
                    return false
                }
                else
                {
                    return true
                }
            }
            

            【讨论】:

              【解决方案11】:

              由于没有人提到reduce,这里是:

              [0, 1, 1, 0].map {"\($0)"}.reduce("") { $0 + $1 } // "0110"
              

              本着函数式编程的精神?

              【讨论】:

              • 很好的做事方式,谢谢...添加一个较短的命令行结尾:[0,1,1,0].map{"\($0)"}.reduce("",+)。 ?
              • @XLE_22 [0,1,1,0].map(String.init).joined()
              【解决方案12】:

              更改可选/非可选字符串数组

              //Array of optional Strings
              let array : [String?] = ["1",nil,"2","3","4"]
              
              //Separator String
              let separator = ","
              
              //flatMap skips the nil values and then joined combines the non nil elements with the separator
              let joinedString = array.flatMap{ $0 }.joined(separator: separator)
              
              
              //Use Compact map in case of **Swift 4**
                  let joinedString = array.compactMap{ $0 }.joined(separator: separator
              
              print(joinedString)
              

              这里 flatMapcompactMap 跳过数组中的 nil 值并附加其他值以提供连接字符串。

              【讨论】:

              • @YashBedi 在 Swift 4 中,我们使用 compactMap 而不是 flatMap
              • “$”是什么意思?
              • @Augusto Swift 自动为内联闭包提供简写参数名称,可用于通过名称 $0、$1、$2 引用闭包参数的值。这里,$0 指的是闭包的第一个 String 参数。
              【解决方案13】:

              Array 创建扩展:

              extension Array {
              
                  var string: String? {
              
                      do {
              
                          let data = try JSONSerialization.data(withJSONObject: self, options: [.prettyPrinted])
              
                          return String(data: data, encoding: .utf8)
              
                      } catch {
              
                          return nil
                      }
                  }
              }
              

              【讨论】:

                【解决方案14】:

                在 Swift 4 中

                let array:[String] = ["Apple", "Pear ","Orange"]
                
                array.joined(separator: " ")
                

                【讨论】:

                  【解决方案15】:

                  如果你想丢弃数组中的空字符串。

                  ["Jet", "Fire"].filter { !$0.isEmpty }.joined(separator: "-")
                  

                  如果你也想过滤 nil 值:

                  ["Jet", nil, "", "Fire"].flatMap { $0 }.filter { !$0.isEmpty }.joined(separator: "-")
                  

                  【讨论】:

                    【解决方案16】:

                    如果您的问题是这样的: tobeFormattedString = ["a", "b", "c"] 输出 = "abc"

                    String(tobeFormattedString)

                    【讨论】:

                    • 不,这不起作用。 String 没有初始化器能够做到这一点。要么您使用的是自定义扩展程序或第三方库,要么您完全搞错了。
                    【解决方案17】:

                    对于某些语言(如希伯来语或日语)来说,分隔符可能不是一个好主意。 试试这个:

                    // Array of Strings
                    let array: [String] = ["red", "green", "blue"]
                    let arrayAsString: String = array.description
                    let stringAsData = arrayAsString.data(using: String.Encoding.utf16)
                    let arrayBack: [String] = try! JSONDecoder().decode([String].self, from: stringAsData!)
                    

                    对于其他数据类型分别:

                    // Set of Doubles
                    let set: Set<Double> = [1, 2.0, 3]
                    let setAsString: String = set.description
                    let setStringAsData = setAsString.data(using: String.Encoding.utf16)
                    let setBack: Set<Double> = try! JSONDecoder().decode(Set<Double>.self, from: setStringAsData!)
                    

                    【讨论】:

                      【解决方案18】:

                      如果你有字符串数组 list ,则转换为 Int

                      let arrayList = list.map { Int($0)!} 
                           arrayList.description
                      

                      它会给你字符串值

                      【讨论】:

                        【解决方案19】:

                        对于任何元素类型

                        extension Array {
                        
                            func joined(glue:()->Element)->[Element]{
                                var result:[Element] = [];
                                result.reserveCapacity(count * 2);
                                let last = count - 1;
                                for (ix,item) in enumerated() {
                                    result.append(item);
                                    guard ix < last else{ continue }
                                    result.append(glue());
                                }
                                return result;
                            }
                        }
                        

                        【讨论】:

                          【解决方案20】:

                          试试这个:

                          let categories = dictData?.value(forKeyPath: "listing_subcategories_id") as! NSMutableArray
                                                  let tempArray = NSMutableArray()
                                                  for dc in categories
                                                  {
                                                      let dictD = dc as? NSMutableDictionary
                                                      tempArray.add(dictD?.object(forKey: "subcategories_name") as! String)
                                                  }
                                                  let joinedString = tempArray.componentsJoined(by: ",")
                          

                          【讨论】:

                            【解决方案21】:

                            当你想将结构类型列表转换为字符串时使用它

                            struct MyStruct {
                              var name : String
                              var content : String
                            }
                            
                            let myStructList = [MyStruct(name: "name1" , content: "content1") , MyStruct(name: "name2" , content: "content2")]
                            

                            并像这样隐藏你的数组

                            let myString = myStructList.map({$0.name}).joined(separator: ",")
                            

                            将产生 ===> "name1,name2"

                            【讨论】:

                              【解决方案22】:

                              如今,在 iOS 13+ 和 macOS 10.15+ 中,我们可能会使用 ListFormatter

                              let formatter = ListFormatter()
                              
                              let names = ["Moe", "Larry", "Curly"]
                              if let string = formatter.string(from: names) {
                                  print(string)
                              }
                              

                              这将产生一个漂亮的、自然语言的列表表示形式。美国用户会看到:

                              萌、拉里和卷毛

                              它将支持 (a) 您的应用已本地化的任何语言; (b) 用户的设备已配置。例如,使用支持德语本地化的应用程序的德国用户会看到:

                              萌,拉里和卷毛

                              【讨论】:

                                【解决方案23】:

                                当您也有结构数组时,您可以使用joined() 获取单个String

                                struct Person{
                                    let name:String
                                    let contact:String
                                }
                                

                                您可以使用map() & joined() 轻松生成字符串

                                PersonList.map({"\($0.name) - \($0.contact)"}).joined(separator: " | ")
                                

                                输出:

                                Jhon - 123 | Mark - 456 | Ben - 789  
                                

                                【讨论】:

                                  【解决方案24】:

                                  如果您想将自定义对象数组转换为字符串或逗号分隔的字符串 (csv),您可以使用

                                   var stringIds = (self.mylist.map{$0.id ?? 0}).map{String($0)}.joined(separator: ",")
                                  

                                  感谢:urvish modi 发帖:Convert an array of Ints to a comma separated string

                                  【讨论】:

                                    猜你喜欢
                                    • 2014-11-13
                                    • 1970-01-01
                                    • 2019-02-17
                                    • 1970-01-01
                                    • 2016-11-20
                                    • 2015-04-16
                                    • 2015-10-11
                                    相关资源
                                    最近更新 更多