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.byteBuffer
quale è 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
)