Cách khởi tạo một chuỗi từ NSData trong Swift


173

Tôi đã cố gắng khởi tạo một chuỗi từ NSDatatrong Swift.

Trong Tài liệu ca cao NSString, Apple nói rằng bạn phải sử dụng tài liệu này:

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

Tuy nhiên, Apple không bao gồm bất kỳ ví dụ nào cho việc sử dụng hoặc nơi để đặt init.

Tôi đang cố gắng chuyển đổi mã sau đây từ Objective-C sang Swift

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

Tôi đã thử rất nhiều cú pháp có thể như sau (tất nhiên là nó không hoạt động):

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

Câu trả lời:


224

Đây là cách bạn nên khởi tạo NSString:

Swift 2.X trở lên

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

Swift 3 hoặc mới hơn:

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

Tài liệu này giải thích cú pháp.


2
Lưu ý rằng bạn không cần lặp lại dữ liệu và các mã hóa khác như thế.
jbg

19
Nên làlet datastring = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Yas T.

14
Có thể chuyển đổi NSDatatrực tiếp thành Swift String(thay vì một NSString) không?
ma11hew28

3
@MattDiPasquale var swiftString = NSString (dữ liệu: NSData!, Mã hóa: UInt) là! Chuỗi đó là tất cả
Gintama

11
@MattDiPasquale Bỏ qua các diễn viên bắt buộc ở trên; Stringlà một NSString... tất cả những nên là:var datastring = String(data: someData, encoding: NSUTF8StringEncoding)
JRaymond

278

Đây là mã được thực hiện cần thiết:

trong Swift 3.0:

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

hoặc chỉ

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

Phiên bản cũ hơn:

trong Swift 2.0:

import Foundation

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

trong Swift 1.0:

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

Swift 2 có một cách khác để làm điều này
Departamento B

3
Đã thêm phiên bản Swift 2.0 ngay bây giờ
Sunkas

Bạn có biết cách Swift 3.0 không? error: use of unresolved identifier 'NSUTF8StringEncoding'
Glenn 'devalias'

2
Đã thêm phiên bản Swift 3.0. Chết tiệt, Apple thích thay đồ!
Sunkas

1
Bạn phải biên dịch theo một phiên bản cụ thể của Swift, vì vậy tất cả mã của bạn sẽ được viết theo 2.x hoặc 3.x. Ngoài ra, lưu ý với phiên bản 3.0 bạn có thể rút ngắn nó bằng cách sử dụng var dataString = String(data: fooData, encoding: .utf8).
ruttopia

15

Swift 2.0

Có vẻ như Swift 2.0 đã thực sự giới thiệu String(data:encoding:)phần mở rộng String khi bạn nhập Foundation. Tôi đã không tìm thấy bất cứ nơi nào mà điều này được ghi lại, đủ kỳ lạ.

(trước Swift 2.0) Tiện ích mở rộng nhẹ

Đây là một phần mở rộng nhỏ có thể sao chép mà không sử dụng NSString, hãy cắt người trung gian.

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

Điều này cũng cung cấp cho bạn quyền truy cập vào data.byteBufferloại trình tự, vì vậy tất cả các thao tác tuyệt vời mà bạn có thể thực hiện với trình tự cũng hoạt động, như thực hiệnreduce { $0 &+ $1 } kiểm tra tổng kiểm tra.

Ghi chú

Trong lần chỉnh sửa trước, tôi đã sử dụng phương pháp này:

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

Vấn đề với cách tiếp cận này là tôi đang tạo một bản sao thông tin vào một mảng mới, do đó, tôi đang nhân đôi số lượng byte (cụ thể encoding size * data.length:)


4

Kể từ phiên bản thứ ba của Swift, bạn có thể làm như sau:

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

simialr theo những gì Sunkas khuyên.


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

2

Một câu trả lời khác dựa trên các phần mở rộng (cậu bé tôi nhớ điều này trong Java):

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

Sau đó, bạn có thể sử dụng nó:

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

Lưu ý rằng chuỗi là tùy chọn, ban đầu NSDatacó thể không thể chuyển đổi thành Utf8.


0

Mục tiêu - C

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

Nhanh

//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-nsopes-or-convert.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.