如何在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