web-dev-qa-db-fra.com

Comment initialiser une chaîne de NSData dans Swift

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

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

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

Cependant, Apple n’a donné aucun exemple d’utilisation ou d’emplacement de la variable init.

J'essaye 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)
169
ahmed

Voici comment initialiser la 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 document explique la syntaxe.

218
67cherries

C'est 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 de 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)
277
Sunkas

Swift 2.0

Il semble que Swift 2.0 ait réellement introduit la String(data:encoding:) en tant qu’extension de chaîne lorsque vous importez Foundation. Je n'ai trouvé aucun endroit où cela est documenté, assez étrangement.

(avant Swift 2.0) Extension légère

Voici une petite extension pouvant être copiée sans utiliser NSString, coupons-le.

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 qui est un type de séquence. Ainsi, toutes les opérations simples que vous pouvez effectuer avec des séquences fonctionnent également, comme le fait de faire un reduce { $0 &+ $1 } pour une somme de contrôle.

Remarques

Dans ma précédente édition, j'avais 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 des informations dans un nouveau tableau. Je duplique donc le nombre d'octets (plus précisément: encoding size * data.length).

15
Can

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

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

semblable à ce que Sunkas a conseillé.

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

Une autre réponse basée sur les extensions (mais est-ce que cela 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, la NSData initiale peut ne pas être convertible en Utf8.

2
elcuco

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

0
Tarun Seera