Coco NSFont 'ведущая' ошибка построения атрибута - PullRequest
0 голосов
/ 11 ноября 2019

В плагине 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];

float lineGap = [native2[NSFontAttributeName] leading];

Компилятор говорит (о последней строке): присваивание 'float' из несовместимого типа 'NSCollectionLayoutSpacing * _Nullable'

ПРИМЕЧАНИЕ. Это было недавно только после перехода на Xcode 11.1, в более старой версии XCode он работал нормально. Любая помощь приветствуется.

1 Ответ

2 голосов
/ 11 ноября 2019

В вашем коде выражение native2[NSFontAttributeName] имеет неизвестный тип и, следовательно, тип id. Компилятор позволит вам отправлять объект типа id любому сообщению без жалоб, но у него нет контекста для определения типа возвращаемого значения сообщения.

Вы хотите получить свойство leading для NSFont, но компилятор просто случайным образом выбирает любой селектор свойства leading, и я предполагаю, что в итоге он выбрал свойство leading для NSCollectionLayoutEdgeSpacing, которое имеет тип возврата NSCollectionLayoutSpacing, а не float.

Я подозреваю, что приведение выражения [(NSFont*)(native2[NSFontAttributeName]) leading] поможет, но если бы я писал этот код, я бы просто сослался на оригинальный (типизированный) объект, поскольку он у вас уже есть:

float lineGap = nativefont.leading;
...