2017-07-25 61 views
5

我的unicode標量(類型是[UnicodeScalar]轉換數組轉換成String在夫特

像的數組:

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

let array2 = "bar".unicodeScalars 

我怎樣纔能有效地轉換這些數組再次變成一個字符串?

期望值:

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

https://stackoverflow.com/a/34294660/2303865 –

回答

6

第二種情況是簡單,因爲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

'自我=字符串(String.UnicodeScalarView(UCS))' –

+0

@LeoDabus:你是對的,就簡單得多了。你應該添加一個答案......(帶或不帶擴展名:) –

+0

我知道用@dfri添加它作爲我的答案是不公平的。 –

1

另一種方式來轉換[UnicodeScalar]String

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

對於由多個unicode標量組成的字符,這不會中斷嗎? – Alexander

+0

@亞歷山大:不,不。創建字符串時再次合併它們。 –

+0

@MartinR有趣的是,我不知道 – Alexander

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"