在Swift中将字符数组转换为字符串

37

[Character]数组目前的输出为:

["E", "x", "a", "m", "p", "l", "e"]

应该是:

Example

可能数组中存在",就像这样:"""。输出应该是"

谢谢!


2
如果您展示数组的声明和定义,您将获得更好的答案。 - Alexander
3个回答

70
其他答案已经涵盖了数组元素为String的情况(这也很可能是您的情况,因为您没有提供数组类型,我们可以使用Swift自己的类型推断规则来猜测类型为[String])。
但是,如果您的数组元素实际上是Character类型,则可以直接使用StringCharacter序列初始化器:
let charArr: [Character] = ["E", "x", "a", "m", "p", "l", "e"]
let str = String(charArr) // Example

关于您下面的评论:如果您的示例数组是某些原因的Any元素(通常不建议显式使用,但有时从某些外部源接收数据时会出现这种情况),则需要先尝试将每个Any元素转换为String类型,然后将转换后的元素连接成单个String实例。转换完成后,您将使用一个String元素数组,此时其他答案中显示的方法将是连接的适当方法:
// e.g. using joined()
let arr: [Any] = ["E", "x", "a", "m", "p", "l", "e"]
let str = arr.flatMap { $0 as? String }.joined()
print(str) // example

您也可以尝试将Any转换为Character元素,但即便如此,您仍需通过String实例进行转换。因此,在处理[Any]的情况时,建议使用上述的joined()方法而非下面的方法:

let arr: [Any] = ["E", "x", "a", "m", "p", "l", "e"]
let str = String(arr.flatMap { ($0 as? String)?.characters.first })
print(str) // example

我忘了提到数组类型是[Character]。当我尝试您的解决方案时,我会得到这个红色错误:“'init'已被重命名为'init(describing:)'” :( - Petravd1994
2
@Petravd1994:你是否有一个可选数组? - Martin R
我将其更改为let str = String(describing: charr),但输出与数组完全相同...现在真的很令人沮丧。我创建了这个数组:var Array1:[Any] = [],然后通过使用Array1.append(Array2 [0])添加元素。现在我希望将Array1转换为字符串,而不是带有""和“,”。该数组不是可选的。 - Petravd1994
1
String(describing:) 产生的字符串与 print() 基本相同。为什么你将数组创建为 [Any]?Swift 不知道它是 [Character],因此它不允许你使用正确的初始化程序调用它。 - Alexander

11

只需使用默认的分隔符""joined()方法:

let joinedString = ["E", "x", "a", "m", "p", "l", "e"].joined()

值得一看这个在性能上与字符串初始化器相比如何。我怀疑它会更快,因为它可以避免内存重新分配。 - Alexander

5
let e = ["E", "x", "a", "m", "p", "l", "e"]
print(e.reduce ("", +))

1
该实现性能不佳(它可能需要 log_2(count) 次内存重新分配)。而且这也是不必要的,因为 String 有一个初始化器,可以从 Character 数组构造字符串。 - Alexander
你可能应该使用joined()方法,但是苹果文档确实声称:“在幕后,Swift的编译器优化字符串使用,以便只有在绝对必要时才进行实际复制。这意味着当您使用字符串作为值类型时,始终可以获得出色的性能。”我想我应该查看反汇编并查看它实际发出了什么。https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html - Josh Homann
我很乐意看看你的发现。这里的问题不是由于值语义而发生的复制,而是在追加到一个长度即将超过其分配容量的字符串时需要重新分配内存。 - Alexander
(... 省略号)Swift既不是C也不是C++,而是一种安全、用户友好的语言,可以深入研究性能,或者直接使用,自然地确保我们不会使用明显的糟糕实践。我个人认为,对于初学者来说,更好的是专注于学习调试和性能分析等工具,而不是花太多时间在核心概念的次优化上,即使有些人发现后者非常有趣。当然,还要花时间学习如何处理和安全解包可选值 :) - dfrib
1
所以我在SIL和汇编语言方面都没有太好的运气,所以我决定只是对这些方法进行分析。我创建了100,000个5-8个字符的随机字符串,并测量了.join它们所需的平均时间为0.066秒,而.reduce它们所需的时间为0.039秒。结果发现reduce要快得多。也许编译器正在消除函数调用并将reduce作为循环插入? - Josh Homann
显示剩余2条评论

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