如何在Swift中从NSData初始化字符串

How to initialise a string from NSData in Swift

我一直在尝试从Swift中的NSData初始化一个字符串。

苹果在NSString Cocoa文档中说您必须使用以下代码:

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

但是,Apple没有提供任何用法或放置init的示例。

我正在尝试将以下代码从Objective-C转换为Swift

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

我一直在尝试许多可能的语法,例如以下语法(当然它不起作用):

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

这是所需的实现代码:

在Swift 3.0中:

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

要不就

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

较早的Swift版本:

在Swift 2.0中:

1
2
3
import Foundation

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

在Swift 1.0中:

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


这是初始化NSString的方法:

Swift 2.X或更旧版本

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

Swift 3或更高版本:

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

本文档说明了语法。


斯威夫特2.0

似乎在导入Foundation时,Swift 2.0实际上已将String(data:encoding:)作为String扩展引入。奇怪的是,我还没有找到记录此文件的任何地方。

(Swift 2.0之前的版本)轻量级扩展

这是一个不使用NSString的可复制粘贴的小扩展名,让我们切开中间人。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 }

笔记

在之前的编辑中,我使用了以下方法:

1
2
3
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开始,您可以执行以下操作:

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

类似于Sunkas的建议。


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

另一个基于扩展的答案(男孩,我在Java中会错过吗):

1
2
3
4
5
extension NSData {
    func toUtf8() -> String? {
        return String(data: self, encoding: NSUTF8StringEncoding)
    }
}

然后,您可以使用它:

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

请注意,该字符串是可选的,初始NSData可能无法转换为Utf8。


目标-C

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

迅速

1
2
3
4
5
6
7
//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