Сбой подмножества Swift Data - PullRequest
       15

Сбой подмножества Swift Data

0 голосов
/ 14 сентября 2018

Всякий раз, когда я пытаюсь установить подмножество своего объекта данных, у меня происходит сбойЯ нашел способ обойти это, но для меня не имеет смысла, почему необходимость сделать это помогает решить проблему.

У меня есть объект данных длиной ровно 1000 байтов.

У меня есть ряд структур, которые перенаправляют этот объект в инициализатор другой структуры.

struct DataHeader {
  let headerVal1: UInt16
  let headerVal2: UInt32

  init(withData: Data) {
    var offset = 0
    var length = MemoryLayout<UInt16>.size
    headerVal1 = uint16Value(data: withData[offset..<length])

    offset = length
    length = MemoryLayout<UInt32>.size + offset
    headerVal2 = uint32Value(data: withData[offset..<length])
  }
}

struct DataBlock {
  let dataVal1: UInt8
  let dataVal2: UInt32
  let dataVal3: Float

  init(withData: Data) {
    var offset = 0
    var length = MemoryLayout<UInt8>.size
    dataVal1 = uint8Value(data: withData[offset..<length])

    offset = length
    length = MemoryLayout<UInt32>.size + offset
    dataVal2 = uint32Value(data: withData[offset..<length]) // <-- CRASH

    offset = length
    length = MemoryLayout<Float>.size + offset
    dataVal3 = floatValue(data: withData[offset..<length])
  }
}

struct EntireData {
  let header: DataHeader
  let block: DataBlock
  // etc. continues for several other structures

  init(withData: Data) {
    var offset = 0
    var length = MemoryLayout<DataHeader>.size

    header = DataHeader(withData: withData[offset..<length])

    offset = length
    length = MemoryLayout<DataBlock>.size
    block = DataBlock(withData: withData[offset..<length])
  }
}

... в другом блоке кода, загружают данные из файла и передают в конструктор EntireData.

Обратите внимание, что первое появление было в порядке.Сбой происходит после того, как код продолжается некоторое время.

Необычная часть, которую я не понимаю, и причина, по которой я задаю этот вопрос, заключается в том, что я нашел обходной путь.По сути, вместо использования withData в конструкторах, сделайте его копию следующим образом:

let unnecessaryDataCopy = withData.advanced(by: 0)

Затем, используя unnecessaryDataCopy вместо withData в качестве аргументов вызова функции, проблем не будет.Система выполняется по точно таким же данным.Я знаю, что там есть данные, потому что есть сотни байтов, которые можно сэкономить.

Я не считаю правильным делать две копии данных только для доступа к ним.(Один с .advanced(by: 0) и один с подмножеством ([смещение .. <длина])). </p>

Почему происходит сбой без ненужного DataCopy и что я могу сделать, чтобы сделать его лучше?Спасибо!

...