我想将nsData解码为String Array。我现在有这个代码:
func nsDataToStringArray(data: NSData) -> [String] {
var decodedStrings = [String]()
var stringTerminatorPositions = [Int]()
var currentPosition = 0
data.enumerateBytes() {
buffer, range, stop in
let bytes = UnsafePointer<UInt8>(buffer)
for i in 0 ..< range.length {
if bytes[i] == 0 {
stringTerminatorPositions.append(currentPosition)
}
currentPosition += 1
}
}
var stringStartPosition = 0
for stringTerminatorPosition in stringTerminatorPositions {
let encodedString = data.subdata(with: NSMakeRange(stringStartPosition, stringTerminatorPosition - stringStartPosition))
let decodedString = NSString(data: encodedString, encoding: String.Encoding.utf8.rawValue)! as String
decodedStrings.append(decodedString)
stringStartPosition = stringTerminatorPosition + 1
}
return decodedStrings
}
但是我在这一行收到错误:let bytes = UnsafePointer<UInt8>(buffer)
无法为类型&#39; UnsafePointer&#39;调用初始化程序。与 类型&#39;(UnsafeRawPointer)&#39;
的参数列表
我是否需要将缓冲区转换为UnsafePointer?如果是这样,我该怎么做?
答案 0 :(得分:2)
buffer
关闭中的 enumerateBytes()
是UnsafeRawPointer
你必须&#34;重新绑定&#34;它在Swift 3中的UInt8
指针:
// let bytes = UnsafePointer<UInt8>(buffer)
let bytes = buffer.assumingMemoryBound(to: UInt8.self)
但为什么这么复杂?您可以使用
获得相同的结果func nsDataToStringArray(nsData: NSData) -> [String] {
let data = nsData as Data
return data.split(separator: 0).flatMap { String(bytes: $0, encoding: .utf8) }
}
这是如何运作的?
Data
是Sequence
的{{1}},因此UInt8
,返回一个数组
&#34;数据切片&#34; (这是对源数据的看法,而不是副本)。split(separator: 0)
Sequence
的{{1}}
可以使用UInt8
创建String
。
这是一个可用的初始化程序(因为数据可能是无效的UTF-8)。String(bytes: $0, encoding: .utf8)
返回一个包含所有非零结果的数组,
即一个包含所有字符串的数组,可以从中创建
零字节之间的有效UTF-8代码序列。