在Swift中将UnicodeScalar数组转换为字符串
我有一个unicode标量数组(类型是在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
[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