#swift #uikit #ios13 #ios14 #uifont
#swift #uikit #ios13 #ios14 #uifont
Вопрос:
В iOS 13 и ниже я получил шрифт.Вес с помощью этого расширения для UIFont
var weight: UIFont.Weight {
guard let traits = fontDescriptor.object(forKey: .traits) as? [UIFontDescriptor.TraitKey: Any], let weightValue = traits[.weight] as? CGFloat else { return .regular }
let weight = UIFont.Weight(rawValue: weightValue)
return weight
}
Но с iOS 14 значение weightValue неверно.
Например:
let font = UIFont(name: "AvenirNext-Bold", size: 21)
print(font?.weight.rawValue)
print(font?.weight == .bold)
iOS 14 — 0.40000000000000002 false
iOS 13 — 0.40000000596046448 верно
Кто-нибудь сталкивался с этим?
Комментарии:
1. Похоже, что iOS 14 более точная, а не «неправильная»
Ответ №1:
Это не ошибка. На самом деле ожидается, что он будет неточным после большого количества знаков после запятой (в данном случае 16). Значения с плавающей запятой вычисляются с помощью стандарта IEEE 754 для арифметики с плавающей запятой одинарной точности. Исходный стандарт был точным только до 7 знаков после запятой для целых чисел от 4 до 6, но он постоянно улучшался по сравнению с оригиналом, например, в 2019 и 2020 годах (подробности см. Здесь).
То, что вы видите, вероятно, является результатом условного приведения. Преобразование из Float
в CGFloat
теряет точность.