0

在 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];

编译器说(关于最后一行):从不兼容的类型'NSCollectionLayoutSpacing * _Nullable'分配给'float '

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

4

1 回答 1

2

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

您想获取 的leading属性NSFont,但编译器只是leading随机选择任何属性选择器,我猜它最终选择了返回类型为not的leading属性。NSCollectionLayoutEdgeSpacingNSCollectionLayoutSpacingfloat

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

float lineGap = nativefont.leading;
于 2019-11-11T06:53:40.363 回答