Из вашего комментария reader?.readByte().hasValue
возвращает огромное число .(Я полагаю, hasValue
- это просто опечатка, и hashValue
.)
Это возможноповедение hashValue
.
Используете ли вы hashValue
, как если бы это был инструмент преобразования UInt8
в Int
?
Это неправильно.Свойство hashValue
реализовано (и должно быть реализовано) для возврата некоторого значения Int
, которое соответствует одной аксиоме:
where a == b, a.hashValue == b.hashValue
В более старых версиях Swift UInt8.hashValue
могло возвращать то же значение типаInt
, но вам не следует полагаться на такие подробности реализации, которые не документированы.Небольшое изменение реализации может привести к другим результатам.
И фактически, Swift 4.2 радикально изменил реализацию hashValue
.
SE-0206 Hashable Enhancements
Возможно, вам придется исправить все части вашего проекта, используя hashValue
.Обычно вы используете Int.init(_:)
для преобразования UInt8
в Int
.
В контексте, подобном Optional Chaining, как показано в вашем let msgType
, вам может потребоваться написать что-то вроде этого.
let msgType = (reader?.getByte()).map{Int($0)}
Если у вас много деталей, которые неправильно используют hashValue
, лучше напишите расширение:
extension UInt8 {
var integerValue: Int {
return Int(self)
}
}
let msgType = reader?.getByte().integerValue
Как правило, лучше не включать такие неправильные хаки в ваш проект.