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

在Swift中将UnicodeScalar数组转换为字符串,swift,string,unicode,Swift,String,Unicode,我有一个unicode标量数组(类型是[UnicodeScalar]) 比如: 或 如何将这些数组有效地再次转换为字符串 期望: let string1 = ?? // "foo" let string2 = ?? // "bar" 第二种情况更简单,因为array2是UnicodeScalarView 而不是数组: let array2 = "bar".unicodeScalars let str2 = String(array2) print(str2) // bar 如果您有一个Un

我有一个unicode标量数组(类型是
[UnicodeScalar]

比如:

如何将这些数组有效地再次转换为字符串

期望:

let string1 = ?? // "foo"
let string2 = ?? // "bar"

第二种情况更简单,因为
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)
扩展字符串{
初始(笛卡尔ucs:S)
其中S.Iterator.Element==UnicodeScalar
{
var s=“”
s、 unicodeScalars.append(内容:ucs)
self=s
}
}
设str1=String(unicodeScalars:array)

[UnicodeScalar]
转换为
字符串的另一种方法:

let array = [UnicodeScalar("f")!, UnicodeScalar("o")!, UnicodeScalar("o")!]
let string1 = String(array.map{Character($0)})
print(string1 == "foo") //->true

您可以使用此扩展名从初始化UnicodeScalar序列中的字符串,如下所示:

extension Sequence where Element == UnicodeScalar { 
    var string: String { .init(String.UnicodeScalarView(self)) } 
}


使用Swift 5,您可以使用以下方法之一从Unicode标量集合中获取字符串


#1.使用
String
init(:)
初始值设定项
String
具有具有以下声明的初始值设定项:

init(_ unicodeScalars: String.UnicodeScalarView)
init(_ scalar: Unicode.Scalar)
创建与给定Unicode标量集合相对应的字符串

下面的示例代码显示了如何使用
init(:)
字符串中获取
String
实例。UnicodeScalarView
实例:

let string = "foo"
let unicodeScalarView = string.unicodeScalars

let newString = String(unicodeScalarView)
print(newString) // prints: foo
如果最初有一个Unicode标量数组,可以首先使用
String.unicodescalaview
的初始值设定项将其转换为
字符串.unicodescalaview
实例:

let scalarsArray = [Unicode.Scalar("f"), Unicode.Scalar("o"), Unicode.Scalar("o")]

let unicodeScalarView = String.UnicodeScalarView(scalarsArray)
let newString = String(unicodeScalarView)
print(newString) // prints: foo

#2.使用
String
init(:)
初始值设定项
String
具有具有以下声明的初始值设定项:

init(_ unicodeScalars: String.UnicodeScalarView)
init(_ scalar: Unicode.Scalar)
以下示例代码显示了如何使用
String
init(:)
在Unicode标量数组上迭代以创建新字符串:

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

#3.使用
String.unicodescalaview
append(contentsOf:)
方法 如果您有一个现有字符串,并且希望将Unicode标量数组的元素附加到该字符串中,则可以使用:


#4.使用
字符的初始值设定项
另一种方法是迭代Unicode标量集合,将它们转换为字符(使用
字符
初始化(:)
初始值设定项),然后从这些字符创建新字符串:

let scalarsArray = [Unicode.Scalar("f"), Unicode.Scalar("o"), Unicode.Scalar("o")]

let charactersArray = scalarsArray.map(Character.init)
let newString = String(charactersArray)
print(newString) // prints: foo

@莱奥达布斯:你说得对,那要简单得多。你应该添加一个答案。。。(有或没有扩展:)我知道用@dfri加上它作为我的答案是不公平的。@LeoDabus:我看不出问题所在。你对这个问题有一个很好的解决方案,不应该隐藏在评论中。你可以添加一个适当的属性参考。好的,我已经发布了一个带有适当属性的回复attribution@dfri:或(对于文字数组):
让数组:[UnicodeScalar]=[“f”、“o”、“o”]
对于由多个unicode标量组成的字符,这个是否会中断?@Alexander:不,不会。在创建字符串时,它们会再次组合起来。@MartinR有趣,我不知道这一点
let scalarsArray = [Unicode.Scalar("f"), Unicode.Scalar("o"), Unicode.Scalar("o")]

let newString = scalarsArray.map(String.init).joined()
print(newString) // prints: foo
let scalarsArray = [Unicode.Scalar("f"), Unicode.Scalar("o"), Unicode.Scalar("o")]

var newString = ""
newString.unicodeScalars.append(contentsOf: scalarsArray)
print(newString) // prints: foo
let scalarsArray = [Unicode.Scalar("f"), Unicode.Scalar("o"), Unicode.Scalar("o")]

let charactersArray = scalarsArray.map(Character.init)
let newString = String(charactersArray)
print(newString) // prints: foo