Чтобы понять эти константы, давайте посмотрим на документацию CTFontStylisticClass
:
Значения класса связаны в старшие четыре бита CTFontSymbolicTraits
и могут бытьполучено через kCTFontClassMaskTrait
.
Для проверки давайте рассмотрим документацию kCTFontClassMaskTrait
.Если вы установите язык Objective-C, документация покажет определения kCTFontClassMaskTrait
:
kCTFontClassMaskTrait = kCTFontTraitClassMask
Так что это просто определяется как другая константа, которая имеет все те же слова вдругой порядок.Ха-ха, Apple, ты веселый.
Хорошо, давайте посмотрим на kCTFontTraitClassMask
документацию .Опять же, если вы установите язык Objective-C, вы можете увидеть определение константы:
kCTFontTraitClassMask = (15U << kCTFontClassMaskShift)
Действительно, 15U
- это четыре последовательных 1 бита, и оно сдвинутоосталось на некоторое количество.Это типично для «маски»: она определяет подмножество битов в двоичном слове.
Чтобы преобразовать CTFontSymbolicTraits
в CTFontStylisticClass
, нам нужно использовать маску, чтобы выбрать только эти битыиз CTFontSymbolicTraits
необработанного значения и используйте результат в качестве необработанного значения 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.