在 iOS 14 中获得 Font.Weight

Get Font.Weight in iOS 14

在 iOS 13 和低版本中,我 Font.Weight 使用 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 假

iOS 13 - 0.40000000596046448 真

有人遇到过吗?

这不是错误。事实上,在小数点后很多位(在本例中为 16 位)之后,它预计是不准确的。浮点数是通过 IEEE 754 单精度浮点运算标准计算的。原始标准仅精确到 7 decimal places for integers between 4 and 6, but this has iteratively improved since the original, for example in 2019 and 2020 (see here 以了解详细信息)。

你看到的应该是条件投射的效果吧。从 FloatCGFloat 的转换失去了精度。