我扩展了swift的数据类型,这样我就可以从一个字符串数组初始化一个实例,然后恢复这些字符串。我有两个版本的初始化器;其中一个按预期工作,另一个则没有。我在这里要求帮助理解非工作版本正在发生的事情。这里是延伸部(其中I注释的一个或另一个的初始化,然后执行测试代码)为什么我的数据初始化程序不能产生预期结果?
public extension Data {
var encoding: String.Encoding { return .utf8 }
// This version works
public init(with: [String]) {
let data = NSMutableData()
with.forEach {
data.append($0.data(using: String.Encoding.utf8)!)
data.append([0], length: 1)
}
self = data as Data
}
// This version does not work
public init(with: [String]) {
self.init()
with.forEach {
self.append($0.data(using: String.Encoding.utf8)!)
self.append(0)
}
}
public func toStringArray() -> [String] {
var decodedStrings = [String]()
var stringTerminatorPositions = [Int]()
var currentPosition = 0
self.enumerateBytes() {
buffer, count, stop in
print("Enumeration count = \(count)")
for i in 0 ..< count {
if buffer[i] == 0 {
stringTerminatorPositions.append(currentPosition)
}
currentPosition += 1
}
}
var stringStartPosition = 0
for stringTerminatorPosition in stringTerminatorPositions {
let encodedString = self.subdata(in: stringStartPosition ..< stringTerminatorPosition)
if let decodedString = String(data: encodedString, encoding: encoding) {
decodedStrings.append(decodedString)
}
stringStartPosition = stringTerminatorPosition + 1
}
return decodedStrings
}
}
这里被测试的代码:
let strings = ["one", "two", "three", "four"]
let encoded = Data(with: strings)
let decoded = encoded.toStringArray()
print("\(encoded as NSData) => \(decoded)")
这里是输出使用时工作初始化:
Enumeration count = 19
<6f6e6500 74776f00 74687265 6500666f 757200> => ["one", "two", "three", "four"]
这里是输出使用非工作时初始化:
Enumeration count = 0
<6f6e6500 74776f00 74687265 6500666f 757200> => []
请注意以下事项:
- 在这两种情况下,打印出的编码字符串然而在toStringArray方法枚举数相同
- 印刷显示,有一些不同的东西。
谢谢你,Hamish。 – Verticon