你如何比较NSFontSymbolicTraits和NSFontBoldTrait在Swift?

时间:2014-09-28 16:05:01

标签: objective-c macos cocoa swift nsfont

我试图按比例比较Swift 中的NSFontSymbolicTraitsNSFontBoldTrait

在Objective-C中,它可以这样完成:

BOOL isBold = (fontDescriptorSymbolicTraits & UIFontDescriptorTraitBold);

所以我认为它应该在Swift中出现:

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

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

  

无法调用'&'使用类型'(NSFontSymbolicTraits,Int)'

的参数列表

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

备注

3 个答案:

答案 0 :(得分:4)

在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)

答案 1 :(得分:0)

基于Nates的答案进行更新,因为他的iOS版本不适用于我。最有可能是由于2014年以来的快速变化。

iOS,Swift 4(.2):

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

答案 2 :(得分:0)

在 iOS 上的 Swift 5.4 中。

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