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.byteBuffer
cuá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
)