How to initialise a string from NSData in Swift
我一直在尝试从Swift中的
苹果在NSString Cocoa文档中说您必须使用以下代码:
1 | init(data data: NSData!, encoding encoding: UInt) |
但是,Apple没有提供任何用法或放置
我正在尝试将以下代码从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) |
这是初始化
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
似乎在导入
(Swift 2.0之前的版本)轻量级扩展
这是一个不使用
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) } |
这也使您可以访问作为序列类型的
笔记
在之前的编辑中,我使用了以下方法:
1 2 3 | var buffer = Array<UInt8>(count: data.length, repeatedValue: 0x00) data.getBytes(&buffer, length: data.length) self.init(bytes: buffer, encoding: encoding) |
这种方法的问题在于,我正在将信息的副本创建到新数组中,因此,我正在复制字节数(具体是:
从第三版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() |
请注意,该字符串是可选的,初始
目标-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