Как вы сравниваете NSFontSymbolicTraits и NSFontBoldTrait в Swift?

Я пытаюсь поразрядно сравнить NSFontSymbolicTraits а также NSFontBoldTrait в Свифте.

В Objective-C это будет сделано так:

BOOL isBold = (fontDescriptorSymbolicTraits & UIFontDescriptorTraitBold);

Так что я думаю, что это должно быть в Swift:

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

... Однако это приводит к следующей ошибке:

Невозможно вызвать '&' со списком аргументов типа '(NSFontSymbolicTraits, Int)'

Кто-нибудь знает, что мне не хватает? Любая помощь будет принята с благодарностью.

Примечания:

  • Я гуглил как сумасшедший и часами пытаюсь найти решение и читаю документацию для NSFontDescriptor и другие NSFont связанные классы.
  • Я не очень хорошо знаю Obj-C, поэтому не знаю, NSFont*Trait константы по-разному реализованы в Swift? Даже не уверен, что это так.

3 ответа

Решение

В Свифте NSFontSymbolicTraits это псевдоним типа для UInt32, Таким образом, чтобы проверить наличие определенной черты, вам нужно сравнить результат вашего побитового & в ноль. К сожалению, отдельные ограничения были импортированы как тип Int, поэтому вам также необходимо преобразовать их в правильный тип:

let isBold = 0 != (font.fontDescriptor.symbolicTraits & NSFontSymbolicTraits(NSFontBoldTrait))

Если вы хотите сделать это в iOS (вместо OS X), UIFont имеет другую реализацию. UIFontDescriptorSymbolicTraits это RawOptionSetTypeтак что вы сравниваете результат вашего & с nil:

let isBold = nil != (font.fontDescriptor().symbolicTraits & UIFontDescriptorSymbolicTraits.TraitBold)

Обновление на основе ответа Нейтса, так как его версия для iOS не работает для меня. Что, скорее всего, связано с изменениями в Swift с 2014 года.

iOS, Swift 4 (.2):

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

В Swift 5.4 на iOS.

      let isBold = font.fontDescriptor.symbolicTraits.contains(.traitBold)
Другие вопросы по тегам