我正在尝试在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中的实现方式不同?甚至不确定情况是否如此
在Swift中,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)
基于Nates的回答进行更新,因为他的iOS版本不适合我。这很可能是由于自2014年以来swift的变化。
iOS,Swift 4(.2):
extension UIFontDescriptor {
var isBold: Bool {
if 0 == (symbolicTraits.rawValue & UIFontDescriptor.SymbolicTraits.traitBold.rawValue) {
return false
} else {
return true
}
}
}
在iOS上的Swift 5.4中。
let isBold = font.fontDescriptor.symbolicTraits.contains(.traitBold)