Як ініціалізувати рядок від NSData в Swift


173

Я намагався ініціалізувати рядок NSDataу Swift.

У Документації щодо какао на NSString Apple говорить, що ви повинні використовувати це:

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

Однак Apple не включила жодного прикладу для використання або куди його поставити init.

Я намагаюся перетворити наступний код з Objective-C в Swift

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

Я намагався багато можливих синтаксисів, таких як наступний (звичайно, це не вийшло):

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

Відповіді:


224

Ось як слід ініціалізувати NSString:

Швидкий 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)
Яс Т.

14
Чи можливо перетворити NSDataбезпосередньо в Swift String(замість an 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. Чорт, Apple подобається міняти речі!
Сункас

1
Ви повинні компілювати проти певної версії Swift, тому ваш код буде записаний проти 2.x або 3.x. Також зауважте, що з версією 3.0 ви можете скоротити її за допомогою var dataString = String(data: fooData, encoding: .utf8).
ruttopia

15

Швидкий 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)

подібний до того, що радив Сункас.



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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.