Swift 2.0
Il semble que Swift 2.0 a en fait introduit le en String(data:encoding:)tant qu'extension String lors de l'importation Foundation. Je n'ai trouvé aucun endroit où cela est documenté, assez bizarrement.
(avant Swift 2.0) Extension légère
Voici une petite extension copiable sans utiliser NSString, coupons l'intermédiaire.
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)
}
Cela vous donne également accès à data.byteBufferquel type de séquence est, donc toutes ces opérations intéressantes que vous pouvez faire avec des séquences fonctionnent également, comme faire un reduce { $0 &+ $1 }pour une somme de contrôle.
Remarques
Dans ma précédente édition, j'ai utilisé cette méthode:
var buffer = Array<UInt8>(count: data.length, repeatedValue: 0x00)
data.getBytes(&buffer, length: data.length)
self.init(bytes: buffer, encoding: encoding)
Le problème avec cette approche est que je crée une copie de l'information dans un nouveau tableau, donc, je dupliquer la quantité d'octets ( en particulier: encoding size * data.length)