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

ahm*_*med 171 string cocoa nsdata swift

我一直在尝试从NSDataSwift中初始化一个字符串.

NSString Cocoa Documentation中, Apple说你必须使用它:

 init(data data: NSData!, encoding encoding: UInt)
Run Code Online (Sandbox Code Playgroud)

然而,Apple没有包含任何使用示例或放置的位置init.

我试图将以下代码从Objective-C转换为Swift

NSString *string;
string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)

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

var string:NSString!
string = init(data: fooData,encoding: NSUTF8StringEncoding)
Run Code Online (Sandbox Code Playgroud)

Sun*_*kas 278

这是所需的实现代码:

在Swift 3.0中:

var dataString = String(data: fooData, encoding: String.Encoding.utf8)
Run Code Online (Sandbox Code Playgroud)

要不就

var dataString = String(data: fooData, encoding: .utf8)
Run Code Online (Sandbox Code Playgroud)

较旧的版本:

在Swift 2.0中:

import Foundation

var dataString = String(data: fooData, encoding: NSUTF8StringEncoding)
Run Code Online (Sandbox Code Playgroud)

在Swift 1.0中:

var dataString = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Run Code Online (Sandbox Code Playgroud)

  • 现在还添加了Swift 2.0版本 (3认同)
  • 还添加了Swift 3.0版本.该死的,苹果喜欢换东西! (2认同)

67c*_*ies 220

这是你应该如何初始化NSString:

Swift 2.X或更早版本

let datastring = NSString(data: fooData, encoding: NSUTF8StringEncoding)
Run Code Online (Sandbox Code Playgroud)

Swift 3或更新版本:

let datastring = NSString(data: fooData, encoding: String.Encoding.utf8.rawValue)
Run Code Online (Sandbox Code Playgroud)

本文档解释了语法.

  • 用`NSUTF8StringEncoding'替换`UInt`对我有用. (35认同)
  • 应该是`let datastring = NSString(data:fooData,encoding:NSUTF8StringEncoding)` (19认同)
  • 是否可以将`NSData`直接转换为Swift`String`(而不是`NSString`)? (13认同)
  • @MattDiPasquale忽略上述强迫演员; `String`是一个`NSString` ...所有这些应该是:`var datastring = String(data:someData,encoding:NSUTF8StringEncoding)` (11认同)
  • @MattDiPasquale var swiftString = NSString(数据:NSData!,编码:UInt)为!字符串就是全部 (3认同)
  • 请注意,您不需要像这样重复"数据"和"编码". (2认同)
  • 你如何做到这一点UInt是一个构造函数?它要我添加括号. (2认同)

Can*_*Can 15

Swift 2.0

似乎Swift 2.0实际上在导入时引入了String(data:encoding:)String扩展Foundation.我没有找到任何记录这里的地方,奇怪的是.

(pre 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)
}
Run Code Online (Sandbox Code Playgroud)

这也使您可以访问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)
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是,我要创建的信息的副本到一个新的数组,从而,我复制的字节数(具体:encoding size * data.length)