我有一组unicode标量(类型为[UnicodeScalar]
)
像:
let array = [UnicodeScalar("f")!, UnicodeScalar("o")!, UnicodeScalar("o")!]
或
let array2 = "bar".unicodeScalars
如何将这些数组有效地转换为字符串?
期望值:
let string1 = ?? // "foo"
let string2 = ?? // "bar"
答案 0 :(得分:9)
第二种情况比较简单,因为array2
是UnicodeScalarView
而不是数组:
let array2 = "bar".unicodeScalars
let str2 = String(array2)
print(str2) // bar
如果您有一个Unicode标量的数组(或任何序列),那么您可以从一个空字符串开始
并将元素附加到unicodeScalars
视图:
let array = [UnicodeScalar("f")!, UnicodeScalar("o")!, UnicodeScalar("o")!]
// Or: let array: [UnicodeScalar] = ["f", "o", "o"]
var str1 = ""
str1.unicodeScalars.append(contentsOf: array)
print(str1) // foo
当然,您可以为此目的定义自定义扩展程序:
extension String {
init<S: Sequence>(unicodeScalars ucs: S)
where S.Iterator.Element == UnicodeScalar
{
var s = ""
s.unicodeScalars.append(contentsOf: ucs)
self = s
}
}
let str1 = String(unicodeScalars: array)
答案 1 :(得分:6)
您可以使用@dfri中的此扩展来初始化UnicodeScalar序列中的字符串,如下所示:
extension Sequence where Iterator.Element == UnicodeScalar {
var string: String { return String(String.UnicodeScalarView(self)) }
}
let array: [UnicodeScalar] = ["f", "o", "o"]
print(array.string) // "foo\n"
答案 2 :(得分:1)
将[UnicodeScalar]
转换为String
的另一种方式:
let array = [UnicodeScalar("f")!, UnicodeScalar("o")!, UnicodeScalar("o")!]
let string1 = String(array.map{Character($0)})
print(string1 == "foo") //->true
答案 3 :(得分:0)
使用Swift 5,您可以使用以下方法之一从Unicode标量集合中获取字符串。
String
的{{1}}初始化程序 init(_:)
有一个init(_:)
初始化程序,带有以下声明:
String
创建与给定的Unicode标量集合相对应的字符串。
下面的Playground示例代码显示了如何使用init(_ unicodeScalars: String.UnicodeScalarView)
从init(_:)
实例中获取String
实例:
String.UnicodeScalarView
如果最初具有Unicode标量数组,则可以先使用let string = "foo"
let unicodeScalarView = string.unicodeScalars
let newString = String(unicodeScalarView)
print(newString) // prints: foo
的{{3}}初始化程序将其转换为String.UnicodeScalarView
实例:
String.UnicodeScalarView
let scalarsArray = [Unicode.Scalar("f"), Unicode.Scalar("o"), Unicode.Scalar("o")]
let unicodeScalarView = String.UnicodeScalarView(scalarsArray)
let newString = String(unicodeScalarView)
print(newString) // prints: foo
的{{1}}初始化程序 String
有一个init(_:)
初始化程序,带有以下声明:
init(_:)
以下Playground示例代码显示了如何使用String
的{{1}}遍历Unicode标量数组以创建新字符串:
init(_ scalar: Unicode.Scalar)
String
init(_:)
的{{1}}方法如果您已有一个字符串,并且想在其中添加Unicode标量数组的元素,则可以使用init(_:)
:
let scalarsArray = [Unicode.Scalar("f"), Unicode.Scalar("o"), Unicode.Scalar("o")]
let string = scalarsArray.reduce("", { partialResult, scalar in
return partialResult + String(scalar)
})
print(string) // prints: foo
let scalarsArray = [Unicode.Scalar("f"), Unicode.Scalar("o"), Unicode.Scalar("o")]
let newString = scalarsArray.map(String.init).joined()
print(newString) // prints: foo
的{{3}}初始化程序另一种方法是对Unicode标量集合进行迭代,将它们转换为字符(使用String.UnicodeScalarView
的{{1}}初始化程序),然后从这些字符创建新的字符串:
append(contentsOf:)