选项在Swift中设置交集

时间:2018-11-26 21:16:38

标签: ios swift option optionsettype

现在,我阅读了有关Core Text的Apple文档,但在理解上有一个问题:

CTFontSymbolicTraits 符合OptionSet。并且CTFontStylisticClass可以通过classMaskTrait中的CTFontStylisticClass选项获得。

我理解classMaskTrait选项可以包括所有CTFontStylisticClass选项吗?例如,如果我想检测sansSerifClass中的CTFontStylisticClass选项:

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

检查示例是否正确?

1 个答案:

答案 0 :(得分:0)

要了解这些常量,让我们看一下CTFontStylisticClass documentation

  

类值捆绑在CTFontSymbolicTraits的高四位中,可以通过kCTFontClassMaskTrait获得。

要验证,让我们看一下kCTFontClassMaskTrait documentation。如果将语言设置为Objective-C,则文档将显示kCTFontClassMaskTrait的定义:

kCTFontClassMaskTrait = kCTFontTraitClassMask

因此,它只是被定义为另一个常数,该常数具有相同的单词,但顺序不同。哈哈,苹果,你真好笑。

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

kCTFontTraitClassMask = (15U << kCTFontClassMaskShift)

实际上,15U是四个连续的1位,向左移了一些。这是典型的“掩码”:它定义了二进制字中位的子集。

要将CTFontSymbolicTraits转换为CTFontStylisticClass,我们需要使用掩码从CTFontSymbolicTraits原始值中仅选择那些位,并将结果用作a的原始值CTFontStylisticClass。我们可以通过使用按位运算符&或通过使用OptionSet方法intersection来进行选择。

在Swift中,我们真正想要的是在CTFontSymbolicTraits上提取一个CTFontStylisticClass的方法。因此,让我们写一个扩展:

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.