我一直在尝试从NSData
Swift中初始化一个字符串.
在NSString Cocoa Documentation中, 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)
Sunkas.. 278
这是所需的实现代码:
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版本 (3认同)
还添加了Swift 3.0版本.该死的,苹果喜欢换东西! (2认同)
67cherries.. 220
这是你应该如何初始化NSString
:
Swift 2.X或更早版本
let datastring = NSString(data: fooData, encoding: NSUTF8StringEncoding)
Swift 3或更新版本:
let datastring = NSString(data: fooData, encoding: String.Encoding.utf8.rawValue)
本文档解释了语法.
这是所需的实现代码:
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)
这是你应该如何初始化NSString
:
Swift 2.X或更早版本
let datastring = NSString(data: fooData, encoding: NSUTF8StringEncoding)
Swift 3或更新版本:
let datastring = NSString(data: fooData, encoding: String.Encoding.utf8.rawValue)
本文档解释了语法.
似乎Swift 2.0实际上在导入时引入了String(data:encoding:)
String扩展Foundation
.我没有找到任何记录这里的地方,奇怪的是.
这是一个没有使用的复制可粘贴的小扩展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
)