Получить шрифт.Вес в iOS 14

#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 теряет точность.