Параметр Устанавливает пересечения в Swift

Теперь я читаю документацию Apple о Core Text, и у меня есть одна проблема с пониманием:

CTFontSymbolicTraits соответствует OptionSet. А CTFontStylisticClass можно получить с помощью опции classMaskTrait в CTFontStylisticClass.

Я правильно понимаю, что опция classMaskTrait может включать в себя все CTFontStylisticClass опции? Например, если я хочу обнаружить опцию sansSerifClass в CTFontStylisticClass:

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

это правильный пример проверки?


person Ihor M.    schedule 26.11.2018    source источник
comment
Прежде чем мы начнем отвечать на этот вопрос, можем ли мы подумать о том, нужен ли основной текст для того, что вы действительно пытаетесь сделать? Что мы на самом деле пытаемся сделать? Это похоже на то, что мы могли бы сделать гораздо проще с дескриптором шрифта и никогда не опускаться до уровня основного текста. Что такое font и на какой вопрос о нем вы пытаетесь ответить?   -  person matt    schedule 27.11.2018
comment
Я хочу определить стилистические качества шрифта   -  person Ihor M.    schedule 27.11.2018


Ответы (1)


Чтобы понять эти константы, давайте посмотрим на 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.
person rob mayoff    schedule 26.11.2018