При попытке получить подданные объекта Data
приложение аварийно завершает работу со следующей ошибкой:
Тема 1: EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкод = 0x0)
Ниже вы можете увидеть код. Это расширение Data
. Надеюсь, кто-то может объяснить, почему это падает.
public extension Data {
/// Removes and returns the range of data at the specified position.
/// - Parameter range: The range to remove. `range` must be valid
/// for the collection and should not exceed the collection's end index.
/// - Returns: The removed data.
mutating func remove(at range: Range<Data.Index>) -> Self {
precondition(range.lowerBound >= 0, "Range invalid, lower bound cannot be below 0")
precondition(range.upperBound < self.count, "Range invalid, upper bound exceeds data size")
let removal = subdata(in: range) // <- Error occurs here
removeSubrange(range)
return removal
}
}
РЕДАКТИРОВАТЬ - добавлены функции вызывающего абонента:
Это расширение вызывается из следующей функции:
func temporary(data: inout Data) -> Data {
let _ = data.removeFirst()
return data.remove(range: 0 ..< 3)
}
Который в свою очередь называется так:
var data = Data([0,1,2,3,4,5])
let subdata = temporary(data: &data)
Data
соответствуетRangeReplaceableCollection
. Почему бы вам не использоватьremoveSubrange
? Кстати,Data.Index
— это просто тип, псевдонимInt
. - person Leo Dabus   schedule 12.08.2020removeSubrange
работает для любогоRangeExpression
- person Leo Dabus   schedule 12.08.2020removeSubrange
не возвращает удаленные данные. Мне нужны удаленные данные, подобныеdata.removeFirst()
, которые возвращаютUInt8
, которые были удалены.removeSubrange
выполняет операцию правильно, но возвращаетVoid
. - person Bram   schedule 12.08.2020var data = Data([0,1,2,3,4,5])
let subdata = data.remove(at: 0..<6)
выдаст Не удалось выполнить предварительное условие: диапазон недействителен, верхняя граница превышает размер данных Верхняя граница диапазона может быть равна count - person Leo Dabus   schedule 12.08.2020count >= 0
правильный, другой должен бытьcount <= upperBound
, конечно! - person Bram   schedule 12.08.2020upperbound <= count
- person Leo Dabus   schedule 12.08.2020