Comment initialiser une chaîne de NSData dans Swift

J’ai essayé d’initialiser une chaîne de NSData dans Swift.

Dans la documentation NSSsortingng Cocoa, Apple dit que vous devez utiliser ceci:

  init(data data: NSData!, encoding encoding: UInt) 

Cependant, Apple n’a pas inclus d’exemple d’utilisation ou de lieu d’ init .

J’essaie de convertir le code suivant d’Objective-C en Swift

 NSSsortingng *ssortingng; ssortingng = [[NSSsortingng alloc] initWithData: data encoding: NSUTF8SsortingngEncoding]; 

J’ai essayé beaucoup de syntaxes possibles telles que les suivantes (bien sûr, cela ne fonctionnait pas):

 var ssortingng:NSSsortingng! ssortingng = init(data: fooData,encoding: NSUTF8SsortingngEncoding) 

Voici comment vous devez initialiser le NSSsortingng :

Swift 2.X ou plus

 let datassortingng = NSSsortingng(data: fooData, encoding: NSUTF8SsortingngEncoding) 

Swift 3 ou plus récent:

 let datassortingng = NSSsortingng(data: fooData, encoding: Ssortingng.Encoding.utf8.rawValue) 

Ce document explique la syntaxe.

C’est le code implémenté nécessaire:

dans Swift 3.0:

 var dataSsortingng = Ssortingng(data: fooData, encoding: Ssortingng.Encoding.utf8) 

ou juste

 var dataSsortingng = Ssortingng(data: fooData, encoding: .utf8) 

Version rapide plus ancienne:

dans Swift 2.0:

 import Foundation var dataSsortingng = Ssortingng(data: fooData, encoding: NSUTF8SsortingngEncoding) 

dans Swift 1.0:

 var dataSsortingng = NSSsortingng(data: fooData, encoding:NSUTF8SsortingngEncoding) 

Swift 2.0

Il semble que Swift 2.0 ait réellement introduit Ssortingng(data:encoding:) tant qu’extension Ssortingng lorsque vous importez 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 pouvant être copiée sans utiliser NSSsortingng , coupons le middle-man.

 import Foundation extension NSData { var byteBuffer : UnsafeBufferPointer { get { return UnsafeBufferPointer(start: UnsafeMutablePointer(self.bytes), count: self.length) }} } extension Ssortingng { init?(data : NSData, encoding : NSSsortingngEncoding) { self.init(bytes: data.byteBuffer, encoding: encoding) } } // Playground test let original = "Nymphs blitz quick vex dwarf jog" let encoding = NSASCIISsortingngEncoding if let data = original.dataUsingEncoding(encoding) { Ssortingng(data: data, encoding: encoding) } 

Cela vous donne également access à data.byteBuffer qui est un type de séquence, donc toutes ces opérations sympas que vous pouvez faire avec les séquences fonctionnent aussi, comme faire une reduce { $0 &+ $1 } pour une sum de contrôle.

Remarques

Dans ma précédente édition, j’ai utilisé cette méthode:

 var buffer = Array(count: data.length, repeatedValue: 0x00) data.getBytes(&buffer, length: data.length) self.init(bytes: buffer, encoding: encoding) 

Le problème avec cette approche, c’est que je crée une copie des informations dans un nouveau tableau. Je duplique donc la quantité d’octets (en particulier: la encoding size * data.length )

Depuis la troisième version de Swift, vous pouvez effectuer les opérations suivantes:

 let desiredSsortingng = NSSsortingng(data: yourData, encoding: Ssortingng.Encoding.utf8.rawValue) 

Simialr à ce que Sunkas a conseillé.

 import Foundation var ssortingng = NSSsortingng(data: NSData?, encoding: UInt) 

Une autre réponse basée sur les extensions (ça me manque en Java):

 extension NSData { func toUtf8() -> Ssortingng? { return Ssortingng(data: self, encoding: NSUTF8SsortingngEncoding) } } 

Ensuite, vous pouvez l’utiliser:

 let data : NSData = getDataFromEpicServer() let ssortingng : Ssortingng? = data.toUtf8() 

Notez que la chaîne est facultative, le NSData initial peut être non convertible à Utf8.

Objectif c

 NSData *mySsortingngData = [@"My Ssortingng" dataUsingEncoding:NSUTF8SsortingngEncoding]; NSSsortingng *mySsortingngFromData = [[NSSsortingng alloc] initWithData:mySsortingngData encoding:NSUTF8SsortingngEncoding]; NSLog(@"My ssortingng value: %@",mySsortingngFromData); 

Rapide

 //This your data containing the ssortingng let mySsortingngData = "My Ssortingng".dataUsingEncoding(NSUTF8SsortingngEncoding) //Use this method to convert the data into Ssortingng let mySsortingngFromData = Ssortingng(data:mySsortingngData!, encoding: NSUTF8SsortingngEncoding) print("My ssortingng value:" + mySsortingngFromData!) 

http://objectivec2swift.blogspot.in/2016/03/coverting-nsdata-to-nsssortingng-or-convert.html