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.byteBuffer
um 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
:)