Как инициализировать строку из NSData в Swift
Я пытался инициализировать строку из NSData в Swift.
на NSString Cocoa Documentation компания 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)
7 ответов:
вот как вы должны инициализировать
NSString:Swift 2.X или старше
let datastring = NSString(data: fooData, encoding: NSUTF8StringEncoding)Swift 3 или новее:
let datastring = NSString(data: fooData, encoding: String.Encoding.utf8.rawValue)этот документ объясняет синтаксис.
это необходимый реализованный код:
в 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)
Swift 2.0
кажется, что Swift 2.0 фактически представил
String(data:encoding:)как расширение строки при импортеFoundation. Я не нашел ни одного места, где это задокументировано, как ни странно.(pre 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 { &+ }для контрольной суммы.Примечания
в моем предыдущем редактировании я использовал этот метод:
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)
начиная с третьей версии Swift вы можете сделать следующее:
let desiredString = NSString(data: yourData, encoding: String.Encoding.utf8.rawValue)simialr к тому, что посоветовал Sunkas.
другой ответ, основанный на расширениях (мальчик, я скучаю по этому в Java):
extension NSData { func toUtf8() -> String? { return String(data: self, encoding: NSUTF8StringEncoding) } }затем вы можете использовать:
let data : NSData = getDataFromEpicServer() let string : String? = data.toUtf8()обратите внимание, что строка необязательна, начальная
NSDataможет быть неконвертируемым в Utf8.
С
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
Comments