如何将 Swift 数组转换为字符串?

Posted

技术标签:

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

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

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

【问题讨论】:

Swift 4: array.description 或者如果你想要自定义分隔符 array.joined(separator: ",") 【参考方案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).mapString($0).joined(separator: ",")

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

【讨论】:

以上是关于如何将 Swift 数组转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

将 Swift 3 数组转换为 JSON

将 Swift 字符串数组转换为 C 字符串数组指针

将 Swift 字符串数组转换为 C 字符串数组指针

将 Swift 字符串数组转换为 const char * const *

将 C 字符数组转换为字符串

如何将json转换为字符串数组