代码之家  ›  专栏  ›  技术社区  ›  Ihor M.

选项设置Swift中的交集

  •  0
  • Ihor M.  · 技术社区  · 6 年前

    CTFontSymbolicTraits 符合 OptionSet . 以及 CTFontStylisticClass 可通过 classMaskTrait 选项 .

    我明白吗 选项可以包括所有 -选择?。例如,如果我想检测 sansSerifClass 选项 CtfontStyleClass类

    CTFontStylisticClass(rawValue: CTFontGetSymbolicTraits(font).rawValue).contains(.sansSerifClass)
    

    这是正确的例子检查吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   rob mayoff    6 年前

    为了理解这些常数,让我们看看 CTFontStylisticClass documentation :

    类值绑定在 CTFontSymbolicTraits kCTFontClassMaskTrait .

    为了验证,让我们看看 kCTFontClassMaskTrait documentation . 如果将语言设置为Objective-C,文档将显示 :

    kCTFontClassMaskTrait = kCTFontTraitClassMask
    

    好吧,让我们看看 kCTFontTraitClassMask documentation . 同样,如果将语言设置为Objective-C,则可以看到常量的定义:

    kCTFontTraitClassMask = (15U << kCTFontClassMaskShift)
    

    的确, 15U

    转换 CTFontSymbolicTraits公司 CtfontStyleClass类 ,我们需要使用掩码从 CTFontSymbolicTraits公司 CtfontStyleClass类 . 我们可以使用位运算符进行选择 & ,或使用 OptionSet 方法 intersection

    我们真正想要的,在斯威夫特,是 CTFontSymbolicTraits公司 CtfontStyleClass类 . 所以让我们写一个扩展:

    extension CTFontSymbolicTraits {
        var stylisticClass: CTFontStylisticClass {
            return CTFontStylisticClass(rawValue: self.intersection(.classMaskTrait).rawValue)
        }
    }
    

    我们来测试一下:

    import CoreText
    import Foundation
    
    extension CTFontSymbolicTraits {
        var stylisticClass: CTFontStylisticClass {
            return CTFontStylisticClass(rawValue: self.intersection(.classMaskTrait).rawValue)
        }
    }
    
    func checkSansSerifness(fontName: String) {
        let font = CTFontCreateWithName(fontName as CFString, 12, nil)
        let fullName = CTFontCopyName(font, kCTFontFullNameKey)!
        if CTFontGetSymbolicTraits(font).stylisticClass.contains(.sansSerifClass) {
            print("\(fullName) is sans serif.")
        } else {
            print("\(fullName) is not sans serif.")
        }
    }
    
    checkSansSerifness(fontName: "Helvetica")
    checkSansSerifness(fontName: "Times New Roman")
    

    输出:

    Helvetica is sans serif.
    Times New Roman is not sans serif.