2017-07-25 28 views
5

tôi có một loạt các vô hướng unicode (Type là [UnicodeScalar])Chuyển đổi Array của UnicodeScalar vào String trong Swift

như:

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

hoặc

let array2 = "bar".unicodeScalars 

làm thế nào tôi có thể chuyển đổi một cách hiệu quả những mảng vào một chuỗi một lần nữa?

mong đợi:

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

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

Trả lời

6

Trường hợp thứ hai là đơn giản vì array2 là một UnicodeScalarView và không phải là một mảng:

let array2 = "bar".unicodeScalars 

let str2 = String(array2) 
print(str2) // bar 

Nếu bạn có một mảng (hoặc bất kỳ chuỗi) của vô hướng Unicode sau đó bạn có thể bắt đầu bằng một chuỗi trống và thêm các phần tử vào chế độ xem 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 

Tất nhiên bạn có thể định nghĩa một phần mở rộng tùy chỉnh cho mục đích đó:

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

'tự = String (String.UnicodeScalarView (UCS)) ' –

+0

@LeoDabus: Bạn nói đúng, đó là đơn giản hơn nhiều. Bạn nên thêm một câu trả lời ... (có hoặc không có phần mở rộng) –

+0

Tôi đã học được rằng với @dfri để thêm nó như là câu trả lời của tôi nó không công bằng. –

1

Một cách khác để chuyển đổi [UnicodeScalar]-String:

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

Điều này không vi phạm các ký tự bao gồm nhiều vô hướng unicode? – Alexander

+0

@Alexander: Không, không. Chúng được kết hợp lại khi tạo chuỗi. –

+0

@MartinR Thú vị, tôi không biết rằng – Alexander

6

Bạn có thể sử dụng phần mở rộng này từ @dfri để khởi tạo một chuỗi từ chuỗi UnicodeScalar như sau:

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" 
Các vấn đề liên quan