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)

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.


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)

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)


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é.


3
import Foundation
var string = NSString(data: NSData?, encoding: UInt)

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.


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.