Comment initialiser une chaîne de NSData dans Swift

173

J'ai essayé d'initialiser une chaîne depuis NSDataSwift.

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

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

Cependant, Apple n'a inclus aucun exemple d'utilisation ou où placer le fichier init.

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

NSString *string;
string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];

J'ai essayé beaucoup de syntaxes possibles telles que les suivantes (bien sûr, cela n'a pas fonctionné):

var string:NSString!
string = init(data: fooData,encoding: NSUTF8StringEncoding)
ahmed
la source

Réponses:

224

Voici comment vous devez initialiser NSString:

Swift 2.X ou plus ancien

let datastring = NSString(data: fooData, encoding: NSUTF8StringEncoding)

Swift 3 ou plus récent:

let datastring = NSString(data: fooData, encoding: String.Encoding.utf8.rawValue)

Ce doc explique la syntaxe.

67 cerises
la source
2
Notez que vous n'avez pas besoin de répéter «données» et «encodage» comme ça.
jbg
19
Devrait êtrelet datastring = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Yas T.
14
Est-il possible de convertir NSDatadirectement en Swift String(au lieu d'un NSString)?
ma11hew28
3
@MattDiPasquale var swiftString = NSString (données: NSData !, encodage: UInt) comme! String That's All
Gintama
11
@MattDiPasquale Ignorez la distribution forcée ci-dessus; Stringest un NSString... tout cela devrait être:var datastring = String(data: someData, encoding: NSUTF8StringEncoding)
JRaymond
278

Voici le code implémenté nécessaire:

dans Swift 3.0:

var dataString = String(data: fooData, encoding: String.Encoding.utf8)

ou juste

var dataString = String(data: fooData, encoding: .utf8)

Ancienne version Swift:

dans Swift 2.0:

import Foundation

var dataString = String(data: fooData, encoding: NSUTF8StringEncoding)

dans Swift 1.0:

var dataString = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Sunkas
la source
Swift 2 a une manière différente de faire cela
Departamento B
3
Ajout d'une version Swift 2.0 également maintenant
Sunkas
Connaissez-vous la méthode Swift 3.0? error: use of unresolved identifier 'NSUTF8StringEncoding'
Glenn 'devalias'
2
Ajout d'une version Swift 3.0 également. Merde, Apple aime changer des choses!
Sunkas
1
Vous devez compiler avec une version spécifique de Swift, donc votre code sera entièrement écrit contre 2.x ou 3.x. Notez également qu'avec la version 3.0, vous pouvez le raccourcir en utilisant var dataString = String(data: fooData, encoding: .utf8).
ruttopia
15

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)

Pouvez
la source
4

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

let desiredString = NSString(data: yourData, encoding: String.Encoding.utf8.rawValue)

simialr à ce que Sunkas a conseillé.

Sergey Petrachkov
la source
3
import Foundation
var string = NSString(data: NSData?, encoding: UInt)
masque
la source
2

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

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

Ensuite, vous pouvez l'utiliser:

let data : NSData = getDataFromEpicServer()
let string : String? = data.toUtf8() 

Notez que la chaîne est facultative, l'initiale NSDatapeut ne pas être convertible en Utf8.

elcuco
la source
0

Objectif c

NSData *myStringData = [@"My String" dataUsingEncoding:NSUTF8StringEncoding]; 
NSString *myStringFromData = [[NSString alloc] initWithData:myStringData encoding:NSUTF8StringEncoding];
NSLog(@"My string value: %@",myStringFromData);

Rapide

//This your data containing the string
   let myStringData = "My String".dataUsingEncoding(NSUTF8StringEncoding)

   //Use this method to convert the data into String
   let myStringFromData =  String(data:myStringData!, encoding: NSUTF8StringEncoding)

   print("My string value:" + myStringFromData!)

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

Tarun Seera
la source