如何在Swift中从NSData初始化一个string

我一直试图从Swift中初始化NSData的string。

在NSString Cocoa文档中, Apple说你必须使用这个:

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

然而,苹果公司并没有包括任何使用示例或在哪里把init

我正试图将下面的代码从Objective-C转换为Swift

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

我一直在尝试很多可能的语法,如下面的(当然,它不工作):

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

这是你应该如何初始化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 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实际上在导入Foundation时引入了String(data:encoding:)作为string扩展。 我还没有find任何地方,这是logging在案,不够古怪。

(之前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) } 

这也让你可以访问序列types的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) 

这种方法的问题是,我正在创build一个信息的副本到一个新的数组,因此,我重复的字节量(具体来说: encoding size * data.length

从Swift的第三个版本开始,您可以执行以下操作:

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

与Sunkasbuild议的一样。

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

另一个基于扩展的答案(男孩,我错过了这个Java):

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

那么你可以使用它:

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

请注意,string是可选的,最初的NSData可能不能转换为Utf8。

目标 – 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