Discussion
Attempting to remove more elements than exist in the collection triggers a runtime error.
Calling this method may invalidate all saved indices of this collection. Do not rely on a previously stored index value after altering a collection with any operation that can change its length.
import Foundation
var data = Data([0, 1, 2, 3, 4, 5])
var newData = data.filter{$0 < 5}
print(newData.index(of: 5) ?? "Ooops") // Ooops
var linesOfData = [Data]()
repeat {
let tmp: Data = getNewData()
let index = tmp.index(of: ...)
linesOfData.append(tmp.prefix(upTo: index))
// ...
} while(...)func prefix(upTo end: Int) -> Data
что в linesOfData добавляется только одна строка из данных полученных getNewData();что за бред? Это был просто пример. Добвляйте в массив ровно так как вам надо.
var linesOfData = [Data]()
let tmp: Data = getNewData()
let index1 = tmp.index(of: ...)
linesOfData.append(tmp.prefix(upTo: index1)) /// 1
let index2 = tmp.suffix(from: index).index(of: ...)
linesOfData.append(tmp.suffix(from: index).prefix(upTo: index2)) /// 2
и так далее
можно всё это красиво обернуть в функцию
тут такой гемор только из-за того факта что вы хотите O(1)
ЭТО ЛИШЬ ПРИМЕР и эту идею можно красиво обернуть в функцию которая так пробежится по всей строке которую выплюнула функцию getNewData()
import Foundation
var linesOfData = [Data]()
let tmp: Data = Data([1, 2, 3, 5, 3, 2, 1, 5])
let index1 = tmp.index(of: 5)
linesOfData.append(tmp.prefix(upTo: index1!))
let index2 = tmp.suffix(from: index1! + 1).index(of: 5)
linesOfData.append(tmp.suffix(from: index1! + 1).prefix(upTo: index2!))
print(linesOfData) // [3 bytes, 3 bytes] private var buffer = Data()
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
buffer.append(data)
var lines = buffer.split(separator: 10, maxSplits: Int.max, omittingEmptySubsequences: false)
guard lines.count > 0 else {
return
}
buffer = lines.popLast()!
for line in lines {
proceedLine(line)
}
}
private var buffer = Data()
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
var lines = data.split(separator: 10, maxSplits: Int.max, omittingEmptySubsequences: false)
guard lines.count > 0 else {
return
}
if !buffer.isEmpty {
buffer.append(lines[0])
lines[0] = buffer
}
buffer = lines.popLast()!
for line in lines {
proceedLine(line)
}
}