Как вы сравниваете 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)