NSData du tableau Byte dans Swift

NSData de créer une var NSData partir d'un tableau d'octets.

En Obj-C, j'aurais pu faire ceci:

NSData *endMarker = [[NSData alloc] initWithBytes:{ 0xFF, 0xD9 }, length: 2]

Je n'arrive pas à find un équivalent dans Swift.

NSData a un initialisateur qui prend un pointeur d' bytes : init(bytes: UnsafeMutablePointer <Void>, length: Int) . Un paramètre UnsafePointer peut accepter une variété de choses différentes, y compris un simple tableau Swift, de sorte que vous pouvez utiliser à peu près la même syntaxe que dans Objective-C. Lorsque vous passez le tableau, vous devez vous assurer de l'identifier comme un tableau UInt8 ou l'inférence de type de Swift supposera que vous voulez créer un tableau Int .

 var endMarker = NSData(bytes: [0xFF, 0xD9] as [UInt8], length: 2) 

Vous pouvez en savoir plus sur les parameters de pointeur non sécurisés dans la documentation Interacting with C APIs d' Apple.

 var foo : Byte[] = [0xff, 0xD9] var data = NSData(bytes: foo, length: foo.count) println("\(data)") 

sorties: ff d9

 var data = NSData(bytes: [0xFF, 0xD9] as Byte[], length: 2) println("\(data)") 

sorties: ff d9

Edit: Ah, vous devez écrire 'Byte []', alors les résultats sont les mêmes


MISE À JOUR pour Swift 2.2

 var foo:[UInt8] = [0xff, 0xD9] var data = NSData(bytes: foo, length: foo.count) print("\(data)") 

sorties: ff d9

 var data = NSData(bytes: [0xFF, 0xD9] as [UInt8], length: 2) print("\(data)") 

sorties: ff d9

Swift 3 extension

 extension Data { init<T>(fromArray values: [T]) { var values = values self.init(buffer: UnsafeBufferPointer(start: &values, count: values.count)) } func toArray<T>(type: T.Type) -> [T] { return self.withUnsafeBytes { [T](UnsafeBufferPointer(start: $0, count: self.count/MemoryLayout<T>.ssortingde)) } } } 

Usage

 let bytes:[UInt8] = [0x00, 0xf4, 0x7c] let data = Data(fromArray: someBytes) print(data as NSData) let bytes = data.toArray(type: UInt8.self) print(bytes) 

Vous n'avez pas besoin d'étendre datatables, dans Swift 3, vous pouvez le faire:

 let bytes:[UInt8] = [0x00, 0x01, 0x02, 0x03]; let data = Data(bytes: bytes); print(data as NSData); 

Impressions "<00010203>"

Pour récupérer le tableau d'octets:

 let byteArray:[UInt8] = [UInt8](data)