Jak zainicjować ciąg z NSData w Swift

173

Próbowałem zainicjować ciąg z poziomu NSDataw języku Swift.

W dokumentacji NSString Cocoa Apple mówi, że musisz użyć tego:

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

Jednak Apple nie podał żadnego przykładu użycia ani miejsca umieszczenia pliku init.

Próbuję przekonwertować następujący kod z Objective-C na Swift

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

Próbowałem wielu możliwych składni, takich jak poniższa (oczywiście to nie działa):

var string:NSString!
string = init(data: fooData,encoding: NSUTF8StringEncoding)
ahmed
źródło

Odpowiedzi:

224

Oto jak powinieneś zainicjować NSString:

Swift 2.X lub starszy

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

Swift 3 lub nowszy:

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

Ten dokument wyjaśnia składnię.

67 wiśni
źródło
2
Pamiętaj, że nie musisz powtarzać „danych” i „kodowania” w ten sposób.
jbg
19
Powinno byćlet datastring = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Yas T.
14
Czy można przekształcić NSDatabezpośrednio w Swifta String(zamiast NSString)?
ma11hew28
3
@MattDiPasquale var swiftString = NSString (dane: NSData !, kodowanie: UInt) as! String to wszystko
Gintama
11
@MattDiPasquale Zignoruj ​​powyższe wymuszone rzucanie; Stringjest NSString... wszystko to powinno być:var datastring = String(data: someData, encoding: NSUTF8StringEncoding)
JRaymond
278

Oto wdrożony kod potrzebny:

w Swift 3.0:

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

Lub tylko

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

Starsza szybka wersja:

w Swift 2.0:

import Foundation

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

w Swift 1.0:

var dataString = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Sunkas
źródło
Swift 2 robi to inaczej
Departamento B
3
Dodano również wersję Swift 2.0
Sunkas
Czy poznałbyś sposób Swift 3.0? error: use of unresolved identifier 'NSUTF8StringEncoding'
Glenn 'devalias'
2
Dodano również wersję Swift 3.0. Cholera, Apple lubi zmieniać rzeczy!
Sunkas
1
Musisz przeprowadzić kompilację pod kątem określonej wersji języka Swift, więc cały kod zostanie napisany w wersji 2.x lub 3.x. Pamiętaj również, że w wersji 3.0 możesz go skrócić, używając var dataString = String(data: fooData, encoding: .utf8).
ruttopia
15

Swift 2.0

Wygląda na to, że Swift 2.0 faktycznie wprowadził String(data:encoding:)rozszerzenie String podczas importu Foundation. Nie znalazłem żadnego miejsca, w którym jest to udokumentowane, co jest dość dziwne.

(przed Swift 2.0) Lekkie rozszerzenie

Oto małe rozszerzenie do skopiowania bez użycia NSString, wytnijmy pośrednika.

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

Daje to również dostęp do tego, data.byteBufferktóry jest typem sekwencji, więc wszystkie te fajne operacje, które możesz wykonać z sekwencjami, również działają, na przykład wykonywanie reduce { $0 &+ $1 }sumy kontrolnej.

Uwagi

W mojej poprzedniej edycji użyłem tej metody:

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

Problem z takim podejściem jest to, że tworzę kopię informacji do nowej tablicy, w ten sposób, ja powielenie ilości bajtów (w szczególności: encoding size * data.length)

Mogą
źródło
4

Od trzeciej wersji Swift możesz wykonać następujące czynności:

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

podobnie jak radził Sunkas.

Sergey Petrachkov
źródło
3
import Foundation
var string = NSString(data: NSData?, encoding: UInt)
mlask
źródło
2

Inna odpowiedź oparta na rozszerzeniach (chłopcze, brakuje mi tego w Javie):

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

Następnie możesz go użyć:

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

Zauważ, że łańcuch jest opcjonalny, początkowy NSDatamoże być niemożliwy do konwersji na Utf8.

elcuco
źródło
0

Cel C

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

Szybki

//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
źródło