Próbowałem zainicjować ciąg z poziomu NSData
w 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)
let datastring = NSString(data: fooData, encoding:NSUTF8StringEncoding)
NSData
bezpośrednio w SwiftaString
(zamiastNSString
)?String
jestNSString
... wszystko to powinno być:var datastring = String(data: someData, encoding: NSUTF8StringEncoding)
Oto wdrożony kod potrzebny:
w Swift 3.0:
Lub tylko
Starsza szybka wersja:
w Swift 2.0:
w Swift 1.0:
źródło
error: use of unresolved identifier 'NSUTF8StringEncoding'
var dataString = String(data: fooData, encoding: .utf8)
.Swift 2.0
Wygląda na to, że Swift 2.0 faktycznie wprowadził
String(data:encoding:)
rozszerzenie String podczas importuFoundation
. 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.Daje to również dostęp do tego,
data.byteBuffer
który jest typem sekwencji, więc wszystkie te fajne operacje, które możesz wykonać z sekwencjami, również działają, na przykład wykonywaniereduce { $0 &+ $1 }
sumy kontrolnej.Uwagi
W mojej poprzedniej edycji użyłem tej metody:
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
)źródło
Od trzeciej wersji Swift możesz wykonać następujące czynności:
podobnie jak radził Sunkas.
źródło
źródło
Inna odpowiedź oparta na rozszerzeniach (chłopcze, brakuje mi tego w Javie):
Następnie możesz go użyć:
Zauważ, że łańcuch jest opcjonalny, początkowy
NSData
może być niemożliwy do konwersji na Utf8.źródło
Cel C
Szybki
http://objectivec2swift.blogspot.in/2016/03/coverting-nsdata-to-nsstring-or-convert.html
źródło