Cara menginisialisasi string dari NSData di Swift

173

Saya telah mencoba menginisialisasi string dari NSDatadalam Swift.

Dalam Dokumentasi Kakao NSString Apple mengatakan Anda harus menggunakan ini:

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

Namun Apple tidak menyertakan contoh apa pun untuk penggunaan atau di mana menempatkan init.

Saya mencoba mengubah kode berikut dari Objective-C ke Swift

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

Saya telah mencoba banyak sintaks yang mungkin seperti berikut (tentu saja tidak berhasil):

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

Jawaban:

224

Ini adalah bagaimana Anda harus menginisialisasi NSString:

Swift 2.X atau lebih tua

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

Swift 3 atau lebih baru:

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

Doc ini menjelaskan sintaksisnya.

Saya tahu
sumber
2
Perhatikan bahwa Anda tidak perlu mengulangi "data" dan "penyandian" seperti itu.
jbg
19
Seharusnyalet datastring = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Yas T.
14
Apakah mungkin untuk mengkonversi NSDatalangsung menjadi Swift String(bukan sebuah NSString)?
ma11hew28
3
@MattDiPasquale var swiftString = NSString (data: NSData !, encoding: UInt) as! String itu saja
Gintama
11
@MattDiPasquale Abaikan pemeran paksa di atas; Stringadalah NSString... semua ini harus:var datastring = String(data: someData, encoding: NSUTF8StringEncoding)
JRaymond
278

Ini adalah kode yang diimplementasikan yang diperlukan:

di Swift 3.0:

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

atau hanya

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

Versi lebih cepat:

dalam Swift 2.0:

import Foundation

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

dalam Swift 1.0:

var dataString = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Sunkas
sumber
Swift 2 memiliki cara berbeda untuk melakukan ini
Departamento B
3
Menambahkan versi Swift 2.0 juga sekarang
Sunkas
Apakah Anda tahu cara Swift 3.0? error: use of unresolved identifier 'NSUTF8StringEncoding'
Glenn 'devalias'
2
Menambahkan versi Swift 3.0 juga. Sial, Apple suka mengganti barang!
Sunkas
1
Anda harus mengompilasi versi Swift tertentu, sehingga kode Anda semua akan ditulis melawan 2.x atau 3.x. Juga, perhatikan dengan versi 3.0 Anda dapat mempersingkatnya dengan menggunakan var dataString = String(data: fooData, encoding: .utf8).
ruttopia
15

Swift 2.0

Tampaknya Swift 2.0 sebenarnya telah memperkenalkan String(data:encoding:)ekstensi String ketika Anda mengimpor Foundation. Saya belum menemukan tempat di mana ini didokumentasikan, cukup aneh.

(pra Swift 2.0) Ekstensi ringan

Ini ekstensi kecil yang bisa di-copy-paste tanpa menggunakan NSString, mari kita potong perantara.

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

Ini juga memberi Anda akses data.byteBufferyang merupakan tipe urutan, sehingga semua operasi keren yang dapat Anda lakukan dengan urutan juga berfungsi, seperti melakukan a reduce { $0 &+ $1 }untuk checksum.

Catatan

Dalam edit saya sebelumnya, saya menggunakan metode ini:

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

Masalah dengan pendekatan ini, adalah bahwa saya membuat salinan informasi ke dalam array baru, jadi, saya menduplikasi jumlah byte (khusus encoding size * data.length:)

Bisa
sumber
4

Sejak versi ketiga Swift, Anda dapat melakukan hal berikut:

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

simialr dengan apa yang disarankan Sunkas.

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

Jawaban lain berdasarkan ekstensi (boy do I miss this di Java):

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

Maka Anda dapat menggunakannya:

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

Perhatikan bahwa string bersifat opsional, inisial NSDatamungkin tidak dapat dikonversi ke Utf8.

elcuco
sumber
0

Tujuan - C

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

Cepat

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