1

我正在尝试按位比较NSFontSymbolicTraitsNSFontBoldTrait Swift

在 Objective-C 中,它会这样做:

BOOL isBold = (fontDescriptorSymbolicTraits & UIFontDescriptorTraitBold);

所以我认为它应该在 Swift 中是这样的:

let isBold:Bool = font.fontDescriptor.symbolicTraits & NSFontBoldTrait

...但是,这会导致以下错误:

无法使用类型为“(NSFontSymbolicTraits,Int)”的参数列表调用“&”

有人知道我错过了什么吗?任何帮助将不胜感激。

备注

4

3 回答 3

4

在 Swift 中,NSFontSymbolicTraitsUInt32. 因此,要检查特定特征的存在,您需要将按位的结果&与零进行比较。不幸的是,各个约束已作为 type 导入Int,因此您还需要将它们转换为正确的类型:

let isBold = 0 != (font.fontDescriptor.symbolicTraits & NSFontSymbolicTraits(NSFontBoldTrait))

如果您想在 iOS(而不是 OS X)中执行此操作,UIFont则有不同的实现。UIFontDescriptorSymbolicTraits是 a RawOptionSetType,因此您将结果&与进行比较nil

let isBold = nil != (font.fontDescriptor().symbolicTraits & UIFontDescriptorSymbolicTraits.TraitBold)
于 2014-09-28T18:45:51.293 回答
0

根据 Nates 的回答进行更新,因为他的 iOS 版本不适合我。这很可能是由于 2014 年以来 swift 的变化。

iOS,斯威夫特 4(.2):

extension UIFontDescriptor {
    var isBold: Bool {
        if 0 == (symbolicTraits.rawValue & UIFontDescriptor.SymbolicTraits.traitBold.rawValue) {
            return false
        } else {
            return true
        }
    }
}
于 2018-11-12T16:06:53.023 回答
0

在 iOS 上的 Swift 5.4 中。

let isBold = font.fontDescriptor.symbolicTraits.contains(.traitBold)
于 2021-05-29T15:20:56.247 回答