如何比较Swift中的NSFontSymbolicTraits和NSFontBoldTrait



我正在尝试在Swift中逐位比较NSFontSymbolicTraitsNSFontBoldTrait

在Objective-C中,它是这样做的:

BOOL isBold = (fontDescriptorSymbolicTraits & UIFontDescriptorTraitBold);

所以我觉得Swift应该是这样的:

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

然而,这会导致以下错误:

无法调用"&"具有类型为"(NSFontSymbolicTraits,Int)"的参数列表

有人知道我缺了什么吗?如有任何帮助,我们将不胜感激。

备注

  • 我像个疯子一样在谷歌上搜索,花了几个小时试图找到解决方案,并阅读了NSFontDescriptor和其他与NSFont相关的类的文档
  • 我不太了解Obj-C,所以我不知道这是否是因为NSFont*Trait常量在Swift中的实现方式不同?甚至不确定情况是否如此

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

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

如果你想在iOS(而不是OS X)中实现这一点,UIFont有一个不同的实现。UIFontDescriptorSymbolicTraitsRawOptionSetType,所以您将&的结果与nil:进行比较

let isBold = nil != (font.fontDescriptor().symbolicTraits & UIFontDescriptorSymbolicTraits.TraitBold)

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

iOS,Swift 4(.2):

extension UIFontDescriptor {
    var isBold: Bool {
        if 0 == (symbolicTraits.rawValue & UIFontDescriptor.SymbolicTraits.traitBold.rawValue) {
            return false
        } else {
            return true
        }
    }
}

在iOS上的Swift 5.4中。

let isBold = font.fontDescriptor.symbolicTraits.contains(.traitBold)

相关内容

  • 没有找到相关文章

最新更新