Как инициализировать строку из NSData в Swift

173

Я пытался инициализировать строку из NSDataв Swift.

В документации NSString Cocoa 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)
Ahmed
источник

Ответы:

224

Вот как вы должны инициализировать NSString:

Swift 2.X или старше

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

Swift 3 или новее:

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

Этот документ объясняет синтаксис.

67cherries
источник
2
Обратите внимание, что вам не нужно повторять «данные» и «кодирование», как это.
JBG
19
Должно бытьlet datastring = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Яс Т.
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:

в Swift 2.0:

import Foundation

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

в Swift 1.0:

var dataString = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Sunkas
источник
Swift 2 имеет другой способ сделать это
Departamento B
3
Также добавлена ​​версия Swift 2.0
Sunkas
Вы случайно не знаете способ Swift 3.0? error: use of unresolved identifier 'NSUTF8StringEncoding'
Гленн 'Девалиас'
2
Также добавлена ​​версия Swift 3.0. Черт, Apple любит что-то менять!
Сункас
1
Вы должны скомпилировать против определенной версии Swift, поэтому весь ваш код будет написан для версии 2.x или 3.x. Также обратите внимание, что с версией 3.0 вы можете сократить ее, используя var dataString = String(data: fooData, encoding: .utf8).
Руттопия
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 к тому, что посоветовал Сункас.

Сергей Петрачков
источник
3
import Foundation
var string = NSString(data: NSData?, encoding: UInt)
mlask
источник
2

Другой ответ, основанный на расширениях (мальчик, я скучаю по этому на Java):

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

Тогда вы можете использовать это:

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

Обратите внимание, что строка является необязательной, начальная NSDataможет быть необратимой для Utf8.

elcuco
источник
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

Тарун Сира
источник