简体   繁体   English

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

[英]How to initialise a string from NSData in Swift

I have been trying to initialise a string from NSData in Swift. 我一直在尝试从Swift中的NSData初始化一个字符串。

In the NSString Cocoa Documentation Apple is saying you have to use this: NSString Cocoa Documentation中, Apple说你必须使用它:

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

However Apple did not include any example for usage or where to put the init . 但是,Apple没有包含任何使用示例或在哪里放置init

I am trying to convert the following code from Objective-C to Swift 我试图将以下代码从Objective-C转换为Swift

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

I have been trying a lot of possible syntaxes such as the following (of course it did not work): 我一直在尝试很多可能的语法,例如以下(当然它不起作用):

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

This is the implemented code needed: 这是所需的实现代码:

in Swift 3.0: 在Swift 3.0中:

var dataString = String(data: fooData, encoding: String.Encoding.utf8)

or just 要不就

var dataString = String(data: fooData, encoding: .utf8)

Older swift version: 较旧的版本:

in Swift 2.0: 在Swift 2.0中:

import Foundation

var dataString = String(data: fooData, encoding: NSUTF8StringEncoding)

in Swift 1.0: 在Swift 1.0中:

var dataString = NSString(data: fooData, encoding:NSUTF8StringEncoding)

This is how you should initialize the NSString : 这是你应该如何初始化NSString

Swift 2.X or older Swift 2.X或更早版本

let datastring = NSString(data: fooData, encoding: NSUTF8StringEncoding)

Swift 3 or newer: Swift 3或更新版本:

let datastring = NSString(data: fooData, encoding: String.Encoding.utf8.rawValue)

This doc explains the syntax. 本文档解释了语法。

Swift 2.0 Swift 2.0

It seems that Swift 2.0 has actually introduced the String(data:encoding:) as an String extension when you import Foundation . 在导入Foundation时,似乎Swift 2.0实际上已将String(data:encoding:)引入为String扩展。 I haven't found any place where this is documented, weirdly enough. 我没有找到任何记录这里的地方,奇怪的是。

(pre Swift 2.0) Lightweight extension (pre Swift 2.0)轻量级扩展

Here's a copy-pasteable little extension without using NSString , let's cut the middle-man. 这是一个不使用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)
}

This also give you access to data.byteBuffer which is a sequence type, so all those cool operations you can do with sequences also work, like doing a reduce { $0 &+ $1 } for a checksum. 这也使您可以访问data.byteBuffer这是一个序列类型,因此您可以使用序列执行的所有那些很酷的操作也可以,例如对校验和执行reduce { $0 &+ $1 }

Notes 笔记

In my previous edit, I used this method: 在我之前的编辑中,我使用了这种方法:

var buffer = Array<UInt8>(count: data.length, repeatedValue: 0x00)
data.getBytes(&buffer, length: data.length)
self.init(bytes: buffer, encoding: encoding)

The problem with this approach, is that I'm creating a copy of the information into a new array, thus, I'm duplicating the amount of bytes (specifically: encoding size * data.length ) 这种方法的问题是,我正在创建一个新的数组的信息副本,因此,我正在复制字节数量(具体来说: encoding size * data.length

Since the third version of Swift you can do the following: 从Swift的第三个版本开始,您可以执行以下操作:

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

simialr to what Sunkas advised. 与Sunkas建议的相似。

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

Another answer based on extensions (boy do I miss this in Java): 基于扩展的另一个答案(男孩,我在Java中想念这个):

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

Then you can use it: 然后你可以使用它:

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

Note that the string is optional, the initial NSData may be unconvertible to Utf8. 请注意,该字符串是可选的,初始NSData可能无法转换为Utf8。

Objective - C 目标 - C.

NSData *myStringData = [@"My String" dataUsingEncoding:NSUTF8StringEncoding]; 
NSString *myStringFromData = [[NSString alloc] initWithData:myStringData encoding:NSUTF8StringEncoding];
NSLog(@"My string value: %@",myStringFromData);

Swift 迅速

//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 http://objectivec2swift.blogspot.in/2016/03/coverting-nsdata-to-nsstring-or-convert.html

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM