Swift 2.0
Có vẻ như Swift 2.0 đã thực sự giới thiệu String(data:encoding:)
phần mở rộng String khi bạn nhập Foundation
. Tôi đã không tìm thấy bất cứ nơi nào mà điều này được ghi lại, đủ kỳ lạ.
(trước Swift 2.0) Tiện ích mở rộng nhẹ
Đây là một phần mở rộng nhỏ có thể sao chép mà không sử dụng NSString
, hãy cắt người trung gian.
import Foundation
extension NSData
{
var byteBuffer : UnsafeBufferPointer<UInt8> { get { return UnsafeBufferPointer<UInt8>(start: UnsafeMutablePointer<UInt8>(self.bytes), count: self.length) }}
}
extension String
{
init?(data : NSData, encoding : NSStringEncoding)
{
self.init(bytes: data.byteBuffer, encoding: encoding)
}
}
// Playground test
let original = "Nymphs blitz quick vex dwarf jog"
let encoding = NSASCIIStringEncoding
if let data = original.dataUsingEncoding(encoding)
{
String(data: data, encoding: encoding)
}
Điều này cũng cung cấp cho bạn quyền truy cập vào data.byteBuffer
loại trình tự, vì vậy tất cả các thao tác tuyệt vời mà bạn có thể thực hiện với trình tự cũng hoạt động, như thực hiệnreduce { $0 &+ $1 }
kiểm tra tổng kiểm tra.
Ghi chú
Trong lần chỉnh sửa trước, tôi đã sử dụng phương pháp này:
var buffer = Array<UInt8>(count: data.length, repeatedValue: 0x00)
data.getBytes(&buffer, length: data.length)
self.init(bytes: buffer, encoding: encoding)
Vấn đề với cách tiếp cận này là tôi đang tạo một bản sao thông tin vào một mảng mới, do đó, tôi đang nhân đôi số lượng byte (cụ thể encoding size * data.length
:)