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

 倩女墨镜aaaaa_259 发布于 2023-01-11 19:24

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

在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

这是所需的实现代码:

在Swift 3.0中:

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)

本文档解释了语法.

3 个回答
  • 这是所需的实现代码:

    在Swift 3.0中:

    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)
    

    2023-01-11 19:26 回答
  • 这是你应该如何初始化NSString:

    Swift 2.X或更早版本

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

    Swift 3或更新版本:

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

    本文档解释了语法.

    2023-01-11 19:26 回答
  • 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)
    }
    

    这也使您可以访问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)

    2023-01-11 19:26 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有