Swift 2.0
Tampaknya Swift 2.0 sebenarnya telah memperkenalkan String(data:encoding:)
ekstensi String ketika Anda mengimpor Foundation
. Saya belum menemukan tempat di mana ini didokumentasikan, cukup aneh.
(pra Swift 2.0) Ekstensi ringan
Ini ekstensi kecil yang bisa di-copy-paste tanpa menggunakan NSString
, mari kita potong perantara.
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)
}
Ini juga memberi Anda akses data.byteBuffer
yang merupakan tipe urutan, sehingga semua operasi keren yang dapat Anda lakukan dengan urutan juga berfungsi, seperti melakukan a reduce { $0 &+ $1 }
untuk checksum.
Catatan
Dalam edit saya sebelumnya, saya menggunakan metode ini:
var buffer = Array<UInt8>(count: data.length, repeatedValue: 0x00)
data.getBytes(&buffer, length: data.length)
self.init(bytes: buffer, encoding: encoding)
Masalah dengan pendekatan ini, adalah bahwa saya membuat salinan informasi ke dalam array baru, jadi, saya menduplikasi jumlah byte (khusus encoding size * data.length
:)