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.byteBuffer
quel 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
)