Swift 2.0
Parece que o Swift 2.0 realmente introduziu a String(data:encoding:)extensão como String quando você importa Foundation. Não encontrei nenhum lugar onde isso esteja documentado, por incrível que pareça.
(pré Swift 2.0) Extensão leve
Aqui está uma pequena extensão que pode ser copiada sem usar NSString, vamos cortar o intermediário.
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)
}
Isso também fornece acesso a data.byteBufferum tipo de sequência, para que todas as operações legais que você pode realizar com sequências também funcionem, como fazer um reduce { $0 &+ $1 }para uma soma de verificação.
Notas
Na minha edição anterior, usei este método:
var buffer = Array<UInt8>(count: data.length, repeatedValue: 0x00)
data.getBytes(&buffer, length: data.length)
self.init(bytes: buffer, encoding: encoding)
O problema com essa abordagem é que estou criando uma cópia das informações em uma nova matriz, portanto, estou duplicando a quantidade de bytes (especificamente encoding size * data.length:)