web-dev-qa-db-ja.com

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

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

NSString Cocoaドキュメント で、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)
169
ahmed

これがNSStringを初期化する方法です。

Swift 2.X以上

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

Swift 3以降

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

このドキュメント は構文を説明しています。

218
67cherries

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

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)
278
Sunkas

スウィフト2.0

Foundationをインポートすると、Swift 2.0では実際にString(data:encoding:)が文字列拡張子として導入されたようです。これが文書化されているところはどこにもありませんでした。

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

15
Can

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

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

sunkasがアドバイスしたものに似ています。

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

拡張機能に基づいたもう1つの答え(私はこれをJavaで見逃していますか?)

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

それからそれを使うことができます:

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

文字列はオプションであり、最初のNSDataはUtf8に変換できないことがあります。

2
elcuco

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

0
Tarun Seera