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

445

我知道如何以编程方式实现它,但我相信有一种内置的方法...

我使用过的每种语言都有一些默认的文本表示方式,用于在尝试将数组与字符串连接或将其传递给print()函数等时输出。苹果的Swift语言是否具有将数组轻松转换为字符串的内置方法,还是我们总是需要明确将数组转换为字符串?


7
Swift 4:array.description或者如果您想要自定义分隔符则使用 array.joined(separator: ",") - Jonathan Solorzano
25个回答

826
如果数组包含字符串,您可以使用 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:"-")

2
@Andrej:它在1.2和2.0上都可以运行。你是否正在使用字符串数组? - Antonio
2
Antonio,抱歉,是我自己的数组出了问题。现在我可以确认你的解决方案有效。 :) - Andrej
14
在Swift 2和Xcode 7 Beta 6中,"-".join(array)不再可用,请尝试使用array.joinWithSeparator("-")。注意保持原意,使内容更易懂。 - Harry Ng
104
joinWithSeparator仅适用于字符串数组。如果您有其他对象的数组,请先使用map。例如,[1, 2, 3].map({"\($0)"}).joinWithSeparator(",") - Dmitry
4
不要仅仅为了将数据转换为字符串而使用字符串插值。更好的方法是使用 String 的初始化器。 - Alexander
显示剩余10条评论

176

在Swift 5中,根据您的需求,您可以选择以下其中一个Playground示例代码来解决问题。


Character数组转换为没有分隔符的String

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

print(string)
// prints "John"

将一个字符串数组转换为没有分隔符的字符串:

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

print(string) // prints: "BobDanBryan"

将一个由String组成的数组转换为带有单词分隔符的String

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

print(string) // prints: "Bob Dan Bryan"

将一个由 String 组成的数组转换为带分隔符的 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"

将一个由Float数组转换为带有数字分隔符的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
1
@user2363025 可以使用JSON解码器。try JSONDecoder().decode([Int].self, from: Data(string.utf8)) - Leo Dabus

49

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
}

23

Swift 3

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

1
我会说它是 ["我爱", "Swift"] .joined(separator: " ") - Loebre

21

既然没有人提到reduce,那我来介绍一下:

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

秉承函数式编程的精神


6
做事的方式不错,谢谢。另外,可以在命令行中加入一个更短的结尾:[0,1,1,0].map{"\($0)"}.reduce("",+) - XLE_22
1
[0,1,1,0]数组中的每个元素转换成字符串,然后拼接起来。 - Leo Dabus
1
或者更快:...reduce(into: "") { $0 += $1 } - Cœur

16

在 Swift 4 中

let array:[String] = ["Apple", "Pear ","Orange"]

array.joined(separator: " ")

9

更改一个包含Optional/Non-Optional字符串的数组

//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 值,并将其他值附加在一起,以生成一个连接的字符串。

4
在Swift 4中,我们使用compactMap而不是flatMap - Agent Smith
"$" 的意思是什么? - Augusto
2
@Augusto Swift自动为内联闭包提供简写参数名称,可以使用名称$0、$1、$2来引用闭包参数的值。在这里,$0指的是闭包的第一个字符串参数。 - Agent Smith

8
现今在 iOS 13+ 和 macOS 10.15+ 中,我们可以使用 ListFormatter
let formatter = ListFormatter()

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

这将生成一个漂亮的自然语言字符串表示列表。美国用户将看到:

Moe, Larry 和 Curly

它支持任何已本地化应用程序并且用户设备配置中的语言。例如,拥有支持德语本地化的应用程序的德国用户将看到:

Moe, Larry und Curly


5

5

您可以使用循环来完成此操作,或者使用map函数。

通过映射:

let array = ["one" , "two" , "three"]
    
array.map({$0}).joined(seperator : ",")

所以在分隔符中,您可以修改字符串。
Output-> ("one,two,three")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接