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)
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.
C'est le code implémenté nécessaire:
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)
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.
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.
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
).
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é.
import Foundation
var string = NSString(data: NSData?, encoding: UInt)
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.
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