SwiftでNSDataから文字列を初期化する方法


173

私はNSDataSwift から文字列を初期化しようとしています。

NSStringのココアのドキュメント 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)

回答:


224

これは、初期化する方法ですNSString

Swift 2.X以前

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

Swift 3以降:

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

このドキュメントでは、構文について説明します。


2
そのように「データ」と「エンコード」を繰り返す必要がないことに注意してください。
jbg 2014

19
する必要がありますlet datastring = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Yas T.

14
(の代わりに)NSData直接Swift に変換することは可能ですか?StringNSString
ma11hew28

3
@MattDiPasquale var swiftString = NSString(data:NSData !, encoding:UInt)as!文字列はすべて
銀魂

11
@MattDiPasquale上記の強制キャストは無視してください。StringあるNSString...これらのすべては、次のようになりますvar datastring = String(data: someData, encoding: NSUTF8StringEncoding)
JRaymond

278

これは、必要な実装済みコードです。

Swift 3.0の場合:

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

あるいは単に

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

古いSwiftバージョン:

Swift 2.0の場合:

import Foundation

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

Swift 1.0の場合:

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

Swift 2には、これを行う別の方法があります
Departamento B

3
Swift 2.0バージョンも追加されました
Sunkas 2015年

あなたはたまたまSwift 3.0の方法を知っていますか?error: use of unresolved identifier 'NSUTF8StringEncoding'
Glenn 'devalias'

2
Swift 3.0バージョンも追加されました。くそー、アップルはものを変えるのが好き!
Sunkas

1
Swiftの特定のバージョンに対してコンパイルする必要があるため、コードはすべて2.xまたは3.xのいずれかに対して記述されます。また、3.0バージョンでは、を使用して短縮できることに注意してくださいvar dataString = String(data: fooData, encoding: .utf8)
ruttopia

15

Swift 2.0

String(data:encoding:)インポート時にSwift 2.0が実際にをString拡張として導入したようですFoundation。奇妙なことに、これが文書化されている場所は見つかりませんでした。

(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)
}

これにより、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


4

Swiftの3番目のバージョン以降、次のことができます。

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

スンカスが忠告したものに似ています。


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

2

拡張機能に基づく別の答え(Javaではこれを見逃してしまいます):

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

次に、それを使用できます:

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

文字列はオプションであり、イニシャルNSDataはUtf8に変換できない場合があることに注意してください。


0

目的-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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.