So initialisieren Sie eine Zeichenfolge aus NSData in Swift

173

Ich habe versucht, eine Zeichenfolge NSDatain Swift zu initialisieren .

In der NSString Cocoa-Dokumentation sagt Apple, dass Sie Folgendes verwenden müssen:

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

Apple hat jedoch kein Beispiel für die Verwendung oder den Ort der Platzierung angegeben init.

Ich versuche, den folgenden Code von Objective-C in Swift zu konvertieren

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

Ich habe viele mögliche Syntaxen wie die folgenden ausprobiert (natürlich hat es nicht funktioniert):

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

Antworten:

224

So sollten Sie Folgendes initialisieren NSString:

Swift 2.X oder älter

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

Swift 3 oder neuer:

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

In diesem Dokument wird die Syntax erläutert.

67cherries
quelle
2
Beachten Sie, dass Sie "Daten" und "Codierung" nicht so wiederholen müssen.
jbg
19
Sollte seinlet datastring = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Yas T.
14
Ist es möglich, NSDatadirekt in einen Swift String(anstelle eines NSString) umzuwandeln ?
ma11hew28
3
@MattDiPasquale var swiftString = NSString (Daten: NSData!, Codierung: UInt) as! String das ist alles
Gintama
11
@MattDiPasquale Ignoriere die oben erzwungene Besetzung. Stringist ein NSString... all dies sollte sein:var datastring = String(data: someData, encoding: NSUTF8StringEncoding)
JRaymond
278

Dies ist der implementierte Code, der benötigt wird:

in Swift 3.0:

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

oder nur

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

Ältere schnelle Version:

in Swift 2.0:

import Foundation

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

in Swift 1.0:

var dataString = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Sunkas
quelle
Swift 2 hat eine andere Art, dies zu tun
Departamento B
3
Jetzt wurde auch eine Swift 2.0-Version
hinzugefügt
Würdest du zufällig den Swift 3.0-Weg kennen? error: use of unresolved identifier 'NSUTF8StringEncoding'
Glenn 'Devalias'
2
Es wurde auch eine Swift 3.0-Version hinzugefügt. Verdammt, Apple mag es, Sachen zu wechseln!
Sunkas
1
Sie müssen gegen eine bestimmte Version von Swift kompilieren, damit Ihr Code entweder gegen 2.x oder 3.x geschrieben wird. Beachten Sie auch, dass Sie mit der Version 3.0 diese mit kürzen können var dataString = String(data: fooData, encoding: .utf8).
Ruttopia
15

Swift 2.0

Es scheint, dass Swift 2.0 die String(data:encoding:)Erweiterung als String beim Importieren tatsächlich eingeführt hat Foundation. Ich habe seltsamerweise keinen Ort gefunden, an dem dies dokumentiert ist.

(vor Swift 2.0) Leichte Erweiterung

Hier ist eine kopierbare kleine Erweiterung, die nicht verwendet werden NSStringkann. Lassen Sie uns den Mittelsmann ausschneiden.

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)
}

Auf diese Weise erhalten Sie auch Zugriff auf data.byteBuffereinen Sequenztyp, sodass alle coolen Operationen, die Sie mit Sequenzen ausführen können, auch funktionieren, z. B. reduce { $0 &+ $1 }für eine Prüfsumme.

Anmerkungen

In meiner vorherigen Bearbeitung habe ich diese Methode verwendet:

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

Das Problem bei diesem Ansatz ist , dass ich eine Kopie der Informationen in ein neues Array bin zu schaffen, damit ich die Menge an Bytes zu duplizieren (speziell: encoding size * data.length)

Können
quelle
4

Seit der dritten Version von Swift können Sie Folgendes tun:

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

ähnlich wie Sunkas geraten hat.

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

Eine andere Antwort basierend auf Erweiterungen (Junge, vermisse ich das in Java):

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

Dann können Sie es verwenden:

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

Beachten Sie, dass die Zeichenfolge optional ist und die Initiale NSDatamöglicherweise nicht in Utf8 konvertierbar ist.

elcuco
quelle
0

Ziel c

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

Schnell

//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
quelle