Я получаю эту ошибку, когда в данных недостаточно байтов для формирования UInt64
(меньше 8). Вполне вероятно, что это именно тот случай.
Один из способов решить эту проблему - изменить uint64
так, чтобы он обрабатывал случай, когда не хватает байтов. Когда не хватает байтов, он может просто заполнить данные нулями, пока их не станет достаточно:
extension Data {
var uint64: UInt64 {
get {
if count >= 8 {
return self.withUnsafeBytes { $0.load(as: UInt64.self) }
} else {
return (self + Data(repeating: 0, count: 8 - count)).uint64
}
}
}
}
Это предполагает, что устройство с прямым порядком байтов и данные с прямым порядком байтов. Если данные имеют старший порядковый номер:
extension Data {
var uint64: UInt64 {
get {
if count >= 8 {
return self.withUnsafeBytes { $0.load(as: UInt64.self).bigEndian }
} else {
return (Data(repeating: 0, count: 8 - count) + self).uint64
}
}
}
}
Или, если можете, исправьте эту проблему на своем устройстве Bluetooth, чтобы оно всегда отправляло 8 байтов.