Как инициализировать строку из NSData в Swift
Я пытаюсь инициализировать строку из 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)
Ответы
Ответ 1
Вот как вы должны инициализировать NSString
:
Swift 2.X и старше
let datastring = NSString(data: fooData, encoding: NSUTF8StringEncoding)
Swift 3 или новее:
let datastring = NSString(data: fooData, encoding: String.Encoding.utf8.rawValue)
Этот документ объясняет синтаксис.
Ответ 2
Это необходимый код:
в 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)
Ответ 3
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 { $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.
Ответ 5
import Foundation
var string = NSString(data: NSData?, encoding: UInt)
Ответ 6
Другой ответ, основанный на расширениях (мальчик, я пропустил это на Java):
extension NSData {
func toUtf8() -> String? {
return String(data: self, encoding: NSUTF8StringEncoding)
}
}
Затем вы можете использовать его:
let data : NSData = getDataFromEpicServer()
let string : String? = data.toUtf8()
Обратите внимание, что строка необязательна, начальная NSData
может быть неконвертируемой для Utf8.
Ответ 7
Цель - C
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