ahm*_*med 171 string cocoa nsdata swift
我一直在尝试从NSData
Swift中初始化一个字符串.
在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
这是所需的实现代码:
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)
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)
本文档解释了语法.
Can*_*Can 15
似乎Swift 2.0实际上在导入时引入了String(data:encoding:)
String扩展Foundation
.我没有找到任何记录这里的地方,奇怪的是.
这是一个没有使用的复制可粘贴的小扩展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
)
归档时间: |
|
查看次数: |
138958 次 |
最近记录: |