我擴展了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