วิธีการเริ่มต้นสตริงจาก NSData ใน Swift


173

ฉันพยายามเริ่มต้นสตริงจากNSDataใน Swift

ในเอกสาร NSString Cocoa Apple กำลังบอกว่าคุณต้องใช้สิ่งนี้:

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

แต่แอปเปิ้ลไม่ได้รวมตัวอย่างใด ๆ initสำหรับการใช้งานหรือสถานที่ที่จะนำ

ฉันพยายามแปลงรหัสต่อไปนี้จาก Objective-C เป็น Swift

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

ฉันได้ลองใช้ซินแท็กซ์ที่เป็นไปได้มากมายเช่นต่อไปนี้ (แน่นอนว่าไม่ได้ทำงาน):

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

คำตอบ:


224

นี่คือวิธีที่คุณควรเริ่มต้นNSString:

Swift 2.X ขึ้นไป

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

Swift 3 หรือใหม่กว่า:

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

เอกสารนี้จะอธิบายเกี่ยวกับไวยากรณ์


2
โปรดทราบว่าคุณไม่จำเป็นต้องทำซ้ำ“ ข้อมูล” และ“ เข้ารหัส” เช่นนั้น
jbg

19
ควรเป็นlet datastring = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Yas T.

14
เป็นไปได้ไหมที่จะแปลงNSDataเป็น Swift โดยตรงString(แทนที่จะเป็นNSString)
ma11hew28

3
@MattDiPasquale var swiftString = NSString (ข้อมูล: NSData !, การเข้ารหัส: UInt) เป็น! สตริงนั่นคือทั้งหมด
Gintama

11
@MattDiPasquale เพิกเฉยกับนักแสดงที่ถูกบังคับข้างต้น StringคือNSString... สิ่งเหล่านี้ควรเป็น:var datastring = String(data: someData, encoding: NSUTF8StringEncoding)
JRaymond

278

นี่เป็นรหัสที่จำเป็นต้องใช้:

ใน Swift 3.0:

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

หรือเพียงแค่

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

รุ่นเก่าอย่างรวดเร็ว:

ใน Swift 2.0:

import Foundation

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

ใน Swift 1.0:

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

Swift 2 มีวิธีที่แตกต่างในการทำเช่นนี้
Departamento B

3
เพิ่มเวอร์ชั่น Swift 2.0 เช่นกันในขณะนี้
Sunkas

คุณจะรู้วิธี Swift 3.0 หรือไม่ error: use of unresolved identifier 'NSUTF8StringEncoding'
Glenn 'devalias'

2
เพิ่มเวอร์ชั่น Swift 3.0 เช่นกัน ไอ้แอปเปิ้ลชอบเปลี่ยนสิ่งต่าง ๆ !
Sunkas

1
คุณต้องคอมไพล์กับ Swift เวอร์ชันเฉพาะดังนั้นโค้ดของคุณจะถูกเขียนด้วย 2.x หรือ 3.x นอกจากนี้ยังทราบด้วยรุ่น 3.0 var dataString = String(data: fooData, encoding: .utf8)คุณสามารถลดได้โดยใช้
ruttopia

15

Swift 2.0

ดูเหมือนว่า Swift 2.0 ได้เปิดตัวString(data:encoding:)ส่วนขยาย String อย่างแท้จริงเมื่อคุณนำเข้าFoundationเมื่อคุณนำเข้า ฉันไม่พบสถานที่ใด ๆ ที่มีการบันทึกไว้แปลกพอ

(ก่อน Swift 2.0) ส่วนขยายที่มีน้ำหนักเบา

นี่คือส่วนขยายเล็ก ๆ ที่คัดลอกได้โดยไม่ต้องใช้NSStringลองตัดคนกลาง

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

นอกจากนี้ยังให้คุณเข้าถึงdata.byteBufferซึ่งเป็นชนิดลำดับดังนั้นการดำเนินการที่ยอดเยี่ยมทั้งหมดที่คุณสามารถทำได้ด้วยลำดับยังใช้ได้เช่นเดียวกับการทำreduce { $0 &+ $1 }เช็คซัม

หมายเหตุ

ในการแก้ไขก่อนหน้าของฉันฉันใช้วิธีนี้:

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

ปัญหาด้วยวิธีนี้คือการที่ฉันสร้างสำเนาของข้อมูลลงในแถวใหม่จึงฉันทำซ้ำจำนวนไบต์ (เฉพาะ: encoding size * data.length)


4

ตั้งแต่ Swift เวอร์ชันที่สามคุณสามารถทำสิ่งต่อไปนี้:

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

simialr ถึงสิ่งที่ Sunkas แนะนำ



2

อีกคำตอบตามนามสกุล (เด็กชายฉันจะพลาดใน Java):

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

จากนั้นคุณสามารถใช้มัน:

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

โปรดทราบว่าสตริงเป็นตัวเลือกเริ่มต้นNSDataอาจไม่สามารถ Utf8


0

วัตถุประสงค์ - ค

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

รวดเร็ว

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.