我试图按比例比较Swift 中的NSFontSymbolicTraits
和NSFontBoldTrait
。
在Objective-C中,它可以这样完成:
BOOL isBold = (fontDescriptorSymbolicTraits & UIFontDescriptorTraitBold);
所以我认为它应该在Swift中出现:
let isBold:Bool = font.fontDescriptor.symbolicTraits & NSFontBoldTrait
...但是会导致以下错误:
无法调用'&'使用类型'(NSFontSymbolicTraits,Int)'
的参数列表
任何人都知道我错过了什么?任何帮助将不胜感激。
备注:
NSFontDescriptor
和其他NSFont
相关课程的文档。NSFont*Trait
constants are implemented differently in Swift?甚至不确定是否属于这种情况。答案 0 :(得分:4)
在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)
答案 1 :(得分:0)
基于Nates的答案进行更新,因为他的iOS版本不适用于我。最有可能是由于2014年以来的快速变化。
iOS,Swift 4(.2):
extension UIFontDescriptor {
var isBold: Bool {
if 0 == (symbolicTraits.rawValue & UIFontDescriptor.SymbolicTraits.traitBold.rawValue) {
return false
} else {
return true
}
}
}
答案 2 :(得分:0)
在 iOS 上的 Swift 5.4 中。
let isBold = font.fontDescriptor.symbolicTraits.contains(.traitBold)