Swift 2.0
Sembra che Swift 2.0 abbia effettivamente introdotto l' String(data:encoding:)estensione String durante l'importazione Foundation. Non ho trovato nessun posto in cui questo sia documentato, stranamente.
(pre Swift 2.0) Estensione leggera
Ecco una piccola estensione incollabile in copia senza usare NSString, tagliamo l'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)
}
Questo ti dà anche accesso a data.byteBufferquale è un tipo di sequenza, quindi tutte quelle fantastiche operazioni che puoi fare con le sequenze funzionano anche, come fare un reduce { $0 &+ $1 }per un checksum.
Appunti
Nella mia modifica precedente, ho usato questo metodo:
var buffer = Array<UInt8>(count: data.length, repeatedValue: 0x00)
data.getBytes(&buffer, length: data.length)
self.init(bytes: buffer, encoding: encoding)
Il problema con questo approccio è che sto creando una copia delle informazioni in una nuova matrice, quindi, sto duplicare la quantità di byte (specificamente: encoding size * data.length)