在Swift中将UnicodeScalar数组转换为String

时间:2017-07-25 05:00:24

标签: swift string unicode

我有一组unicode标量(类型为[UnicodeScalar]

像:

let array = [UnicodeScalar("f")!, UnicodeScalar("o")!, UnicodeScalar("o")!]

let array2 = "bar".unicodeScalars

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

期望值:

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

4 个答案:

答案 0 :(得分:9)

第二种情况比较简单,因为array2UnicodeScalarView 而不是数组:

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标量集合中获取字符串。


#1。使用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

#2。使用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

#3。使用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

#4。使用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:)