Swift 2.0
Parece que Swift 2.0 ha introducido la String(data:encoding:)extensión String cuando importa Foundation. No he encontrado ningún lugar donde esto esté documentado, por extraño que parezca.
(pre Swift 2.0) Extensión ligera
Aquí hay una pequeña extensión que se puede copiar y pegar sin usar NSString, cortemos al intermediario.
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)
}
Esto también le da acceso a data.byteBuffercuál es un tipo de secuencia, por lo que todas esas operaciones interesantes que puede hacer con secuencias también funcionan, como hacer unreduce { $0 &+ $1 } una suma de verificación.
Notas
En mi edición anterior, utilicé este método:
var buffer = Array<UInt8>(count: data.length, repeatedValue: 0x00)
data.getBytes(&buffer, length: data.length)
self.init(bytes: buffer, encoding: encoding)
El problema con este enfoque, es que estoy creando una copia de la información en una nueva matriz, por lo tanto, estoy duplicar la cantidad de bytes (en concreto: encoding size * data.length)