Swift'te NSData'dan bir dize başlatma


173

NSDataSwift bir dize başlatmak için çalışıyorum .

In NSString Kakao Belgeler Elma bunu kullanmak zorunda söylüyor:

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

Ancak Apple, kullanım veya nereye koyacağına dair herhangi bir örnek içermiyordu init.

Swift için Objective-C aşağıdaki kodu dönüştürmek çalışıyorum

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

Aşağıdaki gibi olası sözdizimleri bir sürü deniyorum (tabii ki işe yaramadı):

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

Yanıtlar:


224

Bunu şu şekilde başlatmanız gerekir NSString:

Swift 2.X veya üstü

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

Swift 3 veya daha yenisi:

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

Bu doküman sözdizimini açıklar.


2
“Veri” ve “kodlamayı” bu şekilde tekrarlamanıza gerek olmadığını unutmayın.
jbg

19
Olmalılet datastring = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Yas T.

14
NSDataDoğrudan bir Swift'e String(an yerine NSString) dönüştürmek mümkün müdür ?
29.11.2015

3
@MattDiPasquale var swiftString = NSString (veri: NSData !, kodlama: UInt) olarak! Her şey dize
Gintama

11
@MattDiPasquale Yukarıdaki zorla yayınları yok sayın; StringBir olan NSString... Bunların hepsi olmalıdır:var datastring = String(data: someData, encoding: NSUTF8StringEncoding)
JRaymond

278

Bu, uygulanan koddur:

Swift 3.0'da:

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

ya da sadece

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

Eski hızlı sürüm:

Swift 2.0'da:

import Foundation

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

Swift 1.0'da:

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

Swift 2 bunu yapmanın farklı bir yoluna sahip
Departamento B

3
Şimdi bir Swift 2.0 sürümü eklendi
Sunkas

Swift 3.0 yolunu biliyor musun? error: use of unresolved identifier 'NSUTF8StringEncoding'
Glenn 'devalias'

2
Bir Swift 3.0 sürümü de eklendi. Kahretsin, Apple bir şeyleri değiştirmek gibi!
Sunkas

1
Swift'in belirli bir sürümüne karşı derlemelisiniz, böylece kodunuz 2.x veya 3.x'e karşı yazılır. Ayrıca, 3.0 sürümü ile kullanarak kısaltmak unutmayın var dataString = String(data: fooData, encoding: .utf8).
ruttopia

15

Swift 2.0

Görünüşe göre Swift 2.0, String(data:encoding:)içe aktarırken aslında bir String uzantısı olarak tanıttı Foundation. Bunun belgelendiği bir yer bulamadım, garip bir şekilde.

(Swift 2.0 öncesi) Hafif uzantı

İşte kullanmadan kopyalanabilir küçük bir uzantı NSString, orta adamı keselim.

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

Bu aynı zamanda data.byteBufferbir dizi türü olan erişim sağlar , bu nedenle dizilerle yapabileceğiniz tüm bu harika işlemler de reduce { $0 &+ $1 }bir sağlama toplamı için a yapmak gibi çalışır .

notlar

Önceki düzenlememde bu yöntemi kullandım:

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

Bu yaklaşımdaki sorun, ben böylece, bayt miktarını çoğaltarak ediyorum, yeni bir diziye bilgilerin bir kopyasını oluşturarak olmam (özellikle: encoding size * data.length)


4

Swift'in üçüncü sürümünden beri aşağıdakileri yapabilirsiniz:

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

Sunkas'ın tavsiyelerine simialr.


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

2

Uzantılara dayalı başka bir cevap (çocuk bunu Java'da özlüyorum):

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

Sonra kullanabilirsiniz:

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

Dizenin isteğe bağlı olduğuna dikkat edin, ilk NSDataharf Utf8 ile değiştirilemeyebilir.


0

Amaç - C

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

hızlı

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.