在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];
编译器说(关于最后一行(:从不兼容的类型分配给'float''NSCollectionLayoutSpacing*_Nullable'
注意:自从切换到Xcode 11.1后,这一操作最近才失败,在Xcode的旧版本上,它构建得还可以。感谢您的帮助。
在代码中,表达式native2[NSFontAttributeName]
的类型未知,因此类型为id
。编译器将允许您向id
类型的对象发送任何消息而不抱怨,但它没有用于确定消息返回值类型的上下文。
您想要获得NSFont
的leading
属性,但编译器只是随机选择任何leading
属性选择器,我猜它最终选择了NSCollectionLayoutEdgeSpacing
的leading
属性,其返回类型为NSCollectionLayoutSpacing
而不是float
。
我怀疑强制转换表达式[(NSFont*)(native2[NSFontAttributeName]) leading]
会起作用,但如果我在写这段代码,我只会引用原始(键入的(对象,因为你已经有了它:
float lineGap = nativefont.leading;