Cocoa NSFont 'leading' 属性构建错误

Posted

技术标签:

【中文标题】Cocoa NSFont \'leading\' 属性构建错误【英文标题】:Cocoa NSFont 'leading' attribute build errorCocoa NSFont 'leading' 属性构建错误 【发布时间】:2019-11-11 05:13:22 【问题描述】:

在 AudioUnit 插件中,我使用的是 NSFont。

NSFontManager* fontManager = [NSFontManager sharedFontManager];
NSFont* nativefont = [fontManager fontWithFamily:[NSString stringWithCString: fontFamilyName.c_str() encoding: NSUTF8StringEncoding ] traits:fontTraits weight:5 size:fontSize ];

NSMutableParagraphStyle* style = [[NSMutableParagraphStyle alloc] init];
[style setAlignment : NSTextAlignmentLeft];

NSMutableDictionary* native2 = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
                nativefont, NSFontAttributeName,
                    style, NSParagraphStyleAttributeName,
                    nil];

// .. later
void someFunction(NSMutableDictionary* native2)
   
    float lineGap = [native2[NSFontAttributeName] leading];

编译器说(关于最后一行):assigning to 'float' from in compatible type 'NSCollectionLayoutSpacing * _Nullable'

注意:这只是在切换到 Xcode 11.1 后最近才失败,在旧版本的 XCode 上它构建得很好。任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

在您的代码中,表达式native2[NSFontAttributeName] 的类型未知,因此属于id 类型。编译器将允许您发送id 类型的对象而不会抱怨任何消息,但它没有确定消息返回值类型的上下文。

您想获得NSFontleading 属性,但是编译器只是随机选择任何leading 属性选择器,我猜它最终选择了leadingNSCollectionLayoutEdgeSpacing 属性返回类型为NSCollectionLayoutSpacing 而不是float

我怀疑转换表达式 [(NSFont*)(native2[NSFontAttributeName]) leading] 可以解决问题,但如果我正在编写这段代码,我会简单地引用原始(类型化)对象,因为您已经拥有它:

float lineGap = nativefont.leading;

【讨论】:

在我的情况下,我发布的代码实际上分散在一个更大的代码库中,nativefont 实际上无法访问,但转换为NSFont* 修复了它!

以上是关于Cocoa NSFont 'leading' 属性构建错误的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa NSTextField - 绑定和设置属性

检查 NSFont 在 Swift 中是不是为粗体

字体“SF Mono”的 NSFont 名称是啥?

从 NSFont 获取所有字符

等价于 NSFont 中的 UIFont .withSize

NSFont 在 macOS Catalina 中无法正常工作